이 섹션에서는 패싯 검색이라고 하는 검색 구현에서 널리 사용되는 필터에서 파생된 패턴에 대해 알아볼 것입니다. 이 아이디어는 사용자가 쿼리를 실행한 다음 결과와 함께 추천 필터 목록을 표시하는 것입니다.

다음 스크린샷은 현재 애플리케이션에 구현된 두 필터에 대한 패싯이 있는 왼쪽 사이드바를 보여줍니다.

다음은 패싯 검색 결과에 대한 세부 정보입니다. 각 항목이 현재 검색에 필터를 추가하는 클릭 가능한 링크로 렌더링되는 방식에 주목하세요. 또한 각 페이지는 포함된 결과의 수를 보고합니다.

학기 집계

Elasticsearch에서 패싯 검색은 집계 기능을 사용하여 구현됩니다. 지원되는 집계 중 하나는 몇 가지 기준에 따라 검색 결과를 버킷으로 나눕니다. 각각에 포함된 문서 수를 포함한 버킷 목록은 패싯 사이드바를 렌더링하는 데 사용됩니다.

가장 간단한 버킷 집계 유형은 각 키워드에 대해 버킷이 정의된 집계 유형입니다. 용어 집계라고 하는 이 유형은 category 필드에 대한 버킷을 만드는 데 적합합니다. 다음은 카테고리 집계를 요청하도록 확장된 애플리케이션의 검색 요청입니다:

유일한 변경 사항은 aggs 옵션이 추가된 것입니다. 각 집계에는 이름(이 경우 category-agg)이 지정됩니다. terms 집계는 키워드별로 필터링을 수행해야 함을 나타냅니다. 필터와 마찬가지로 category 필드는 필드와 연결된 키워드 하위 유형이 사용되도록 category.keyword 으로 지정해야 합니다.

집계가 포함된 요청에 대한 응답에는 집계된 결과가 포함된 aggregations 필드가 있습니다. 위의 예시 요청에 대한 응답은 다음과 같습니다:

튜토리얼 애플리케이션에 포함된 index.html 템플릿은 이미 왼쪽 사이드바에 집계를 렌더링하도록 설계되어 있으며, 이 시점까지만 해도 비어 있었습니다. 템플릿 로직을 단순하게 유지하려면 위 응답의 데이터를 다음과 같은 구조의 사전으로 변환해야 합니다:

다음 목록은 Elasticsearch 집계 형식을 위의 단순화된 사전으로 변환하는 방법과 변환된 사전을 템플릿으로 전송하여 렌더링하는 방법을 보여줍니다:

궁금하신 경우를 대비하여 index.html에는 aggs 사전을 렌더링하는 다음 로직이 포함되어 있습니다:

이 구현은 다음 및 이전 페이지 매김 버튼을 렌더링하는 데 사용된 것과 유사한 아이디어를 사용합니다. 각 패싯은 해당 추가된 필터로 쿼리를 정의하는 숨겨진 필드가 있는 양식으로 렌더링됩니다. 예를 들어 sharepoint 카테고리 패싯은 현재 쿼리에 category:sharepoint 을 추가합니다.

각 패싯의 제출 버튼은 단순히 외관상 디테일로 링크 스타일로 렌더링됩니다.

연도 집계

아시다시피 인덱스는 연도를 키워드로 개별적으로 저장하지 않기 때문에 카테고리와 함께 사용된 집계 용어는 이전 섹션에서 만든 연도 필터에서는 작동하지 않습니다. 대신 각 문서가 업데이트된 연도는 전체 날짜를 저장하는 updated_at 필드에 정의됩니다.

사용 가능한 버킷 집계 목록 중에서 이 사용 사례에 가장 적합한 것은 날짜 히스토그램입니다. 업데이트된 집계 요청은 다음과 같습니다:

여기에서 aggs 필드에 두 번째 집계가 추가된 것을 볼 수 있습니다. 이 집계 유형은 date_histogram 이고 간격은 year 으로 설정하여 각각 생성되는 버킷이 1년을 나타내도록 합니다. format 옵션은 각 버킷의 이름에 사용할 형식을 구성하며, 이 경우 연도만 포함해야 합니다.

이제 응답의 aggregations 필드에 두 개의 섹션이 포함됩니다:

이 두 번째 집계에는 또 다른 사소한 문제가 있습니다. 각 버킷에 포함된 key 필드는 날짜 간격 집계의 경우 밀리초 단위이므로 유용하지 않습니다. 하지만 다행히도 집계에서 format 옵션에 지정된 형식으로 렌더링된 날짜는 key_as_string 필드에 제공됩니다.

다음은 모든 패싯을 포함한 aggs 사전이 계산되는 방식입니다:

key 대신 key_as_string 을 사용하는 것 외에도 연도 패싯의 경우 문서가 0개인 버킷은 필터로 사용할 필요가 없으므로 이를 제거하기 위해 조건이 추가됩니다.

이것으로 패싯 검색 구현이 완료되었습니다. 다음은 handle_search() 함수의 전체 구현입니다:

이 튜토리얼에 포함된 패싯 검색의 구현은 단순성을 염두에 두고 설계되었습니다. Elasticsearch의 집계에는 아직 다루지 않은 많은 가능성이 있으므로 이 기능의 모든 것을 알아보려면 설명서를 검토하세요.

축하합니다, 이 튜토리얼의 전체 텍스트 검색 섹션을 마치셨습니다! 여기를 클릭하여 현재까지의 튜토리얼 검색 애플리케이션 상태를 검토하세요.

이전 버전

필터

최첨단 검색 환경을 구축할 준비가 되셨나요?

충분히 고급화된 검색은 한 사람의 노력만으로는 달성할 수 없습니다. Elasticsearch는 여러분과 마찬가지로 검색에 대한 열정을 가진 데이터 과학자, ML 운영팀, 엔지니어 등 많은 사람들이 지원합니다. 서로 연결하고 협력하여 원하는 결과를 얻을 수 있는 마법 같은 검색 환경을 구축해 보세요.

직접 사용해 보세요