하이브리드 검색: 전체 텍스트 및 ELSER 결과 결합

이전 섹션의 벡터 검색과 마찬가지로, 이 섹션에서는 상호 순위 융합 알고리즘을 사용하여 전체 텍스트 및 시맨틱 쿼리에서 최상의 검색 결과를 결합하는 방법을 알아봅니다.

하위 검색 소개

하이브리드 전체 텍스트 및 밀도 벡터 검색을 구현하기 위한 해결책은 query, knn 인수를 포함하여 두 검색을 요청하는 검색 요청과 rrf 인수를 포함하여 두 검색을 단일 결과 목록으로 결합하는 검색 요청을 보내는 것이었습니다.

전체 텍스트와 희소 벡터 검색 요청을 결합하기 위해 동일한 작업을 시도할 때 나타나는 복잡성은 둘 다 query 인수를 사용한다는 것입니다. RRF 알고리즘으로 결합해야 하는 두 개의 쿼리를 제공하려면 두 개의 query 인수를 포함해야 하며, 이를 위한 해결책은 하위 검색을 사용하는 것입니다.

하위 검색은 현재 기술 미리보기 단계에 있는 기능입니다. 이러한 이유로 Python Elasticsearch 클라이언트는 기본적으로 이를 지원하지 않습니다. 이 제한을 해결하려면 Search 클래스의 search() 메서드를 body 인수를 사용하여 검색 요청을 보내도록 변경할 수 있습니다. 아래에서 클라이언트의 body 인수를 사용하여 검색 요청을 보내는 새롭지만 유사한 구현을 볼 수 있습니다:

이 구현은 기능적으로 동일하므로 애플리케이션을 변경할 필요가 없습니다. 유일한 차이점은 search() 메서드는 요청을 보내기 전에 모든 인수의 유효성을 검사하지만 body 메서드는 유일한 예외입니다. 서버는 클라이언트가 요청을 보내는 방식에 관계없이 항상 요청의 유효성을 검사합니다.

이 버전에서는 sub_searches 인수를 Search.search() 에 사용하여 다음과 같이 여러 개의 검색 쿼리를 보낼 수 있습니다:

하이브리드 검색 구현

이 섹션을 완성하기 위해 전체 텍스트 로직을 다시 가져와서 이 장의 앞부분에 제시된 시맨틱 검색 쿼리와 결합해 보겠습니다.

아래에서 업데이트된 handle_search() 엔드포인트를 확인할 수 있습니다:

기억하시겠지만 extract_filters() 함수는 검색 프롬프트에서 사용자가 입력한 카테고리 필터를 찾고 남은 부분을 parsed_query 으로 반환합니다. parsed_query 이 비어 있으면 사용자가 카테고리 필터만 입력했다는 의미이며, 이 경우 쿼리는 선택한 카테고리를 필터로 사용하는 간단한 match_all 이어야 합니다. 이는 큰 조건의 else 부분에서 구현됩니다.

검색 쿼리가 있는 경우 이전 섹션에 표시된 것처럼 sub_searches 옵션을 사용하여 multi_matchtext_expansion 쿼리를 포함하고, rank 옵션을 사용하여 두 하위 검색의 결과를 단일 순위 결과 목록으로 통합하도록 요청합니다. 쿼리를 완료하려면 페이지 매김 지원을 유지하기 위해 sizefrom_ 인수가 제공됩니다.

이 버전의 애플리케이션을 검토하려면 여기를 클릭하세요.

이전 버전

시맨틱 쿼리

다음

결론

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

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

직접 사용해 보세요