필터·정렬·패싯
필터·정렬·패싯
쇼핑몰에서 "재고 있는 상품만", "가격 오름차순으로", "색상별 개수" 를 한 화면에 보여주고 싶다면? Meilisearch의 필터링, 정렬, 패싯이 정확히 그 일을 해줘요. 세 기능은 서로 다른 목적을 갖고 있지만, 한 검색 요청에 함께 결합할 수 있어 인터랙티브한 탐색 UI를 만들 때 빠질 수 없는 도구랍니다. 이 글에서는 각 기능이 무엇이고 어떻게 함께 쓰는지 정리해 드릴게요.
본문
세 기능의 큰 그림부터 볼게요:
- 필터링(Filtering) 은 특정 기준(예:
genre = "action")에 맞는 문서만으로 결과를 좁혀요. - 정렬(Sorting) 은 필드 값(예: 가격 오름차순)으로 결과의 순서를 정합니다.
- 패싯(Faceting) 은 필드 값별 집계 개수를 반환해서, UI에서 카테고리 탐색을 지원해요.
필터 vs 패싯
| 기능 | 목적 | 예시 | | Filters | 결과에서 조건에 맞지 않는 문서 제거 | 재고 있는 상품만 표시 | | Facets | 개수와 함께 선택 가능한 옵션 표시 | "색상: 빨강 (12), 파랑 (8)" | | Sorting | 필드로 결과 정렬 | 싼 것부터 |
패싯은 분포 데이터도 함께 반환하는 필터라고 생각하면 쉬워요. 이 둘을 함께 쓰면 이커머스 스타일의 인터랙티브 탐색을 만들 수 있습니다.
동작 원리
필터, 정렬, 패싯을 사용하려면 그 전에 먼저 해당 속성을 인덱스 설정에 선언해야 해요. 필터링과 패싯을 활성화하려면 속성을 filterableAttributes에 추가하고, 정렬을 활성화하려면 sortableAttributes에 추가합니다.
검색 시점에는 filter 파라미터에 필터 표현식을, sort 파라미터에 정렬 지시를, 그리고 facets 파라미터로 패싯 분포를 요청해요. 세 가지는 단일 검색 요청에 모두 결합할 수 있습니다.
주요 사용 사례
- 이커머스 패싯 탐색: 쇼핑객이 브랜드·색상·크기·가격대로 상품을 좁히면서 각 옵션의 개수를 함께 볼 수 있게 해줘요.
- 날짜 범위 필터링: 지난 30일 동안 게시된 기사나 이번 주에 열리는 이벤트처럼 특정 시간 범위로 결과를 제한합니다.
- 가격·평점 정렬: 가격(오름차순/내림차순)이나 평균 고객 평점으로 결과를 정렬하게 해줘요.
- 위치 기반 필터링: 지리 검색 필터를 카테고리 필터와 결합해, 특정 조건에 맞는 주변 음식점·매장·목록을 보여줍니다.