kNN(가장 가까운 이웃) 검색

kNN(k-근접 이웃) 알고리즘은 dense_vector 유형의 필드에서 유사성 검색을 수행합니다. 이 검색 유형은 "대략적인 kNN" 이라고 부르는 것이 더 적절하며, 벡터 또는 임베딩을 검색어로 받아들이고 색인에서 가까운 항목을 찾습니다.

이 섹션에서는 이전 섹션에서 만든 문서 임베딩을 사용하여 kNN 검색을 실행하는 방법에 대해 알아봅니다.

knn

튜토리얼의 전체 텍스트 검색 섹션에서 Elasticsearch 클라이언트의 search() 메서드로 전달되는 쿼리 옵션에 대해 배웠습니다. 벡터를 검색할 때는 knn 옵션이 대신 사용됩니다.

아래에서 사용자가 검색 양식에 입력한 쿼리에 대해 kNN 검색을 실행하는 app.py의 새로운 버전의 handle_search() 함수를 확인할 수 있습니다.

이 버전의 함수에서는 query 옵션이 knn 으로 대체되었습니다. 페이지 매김에 대한 sizefrom_ 옵션은 그대로 유지되며 함수 및 index.html 템플릿의 다른 모든 항목도 이전과 동일합니다.

knn 검색 옵션은 검색을 구성하는 여러 매개변수를 허용합니다:

  • field색인에서 검색할 필드입니다. 필드는 dense_vector 유형이어야 합니다.
  • query_vector검색할 임베딩을 선택합니다. 검색 텍스트에서 생성된 임베딩이어야 합니다.
  • num_candidates각 샤드에서 고려할 후보 문서 수입니다. Elasticsearch는 각 샤드에서 이 많은 후보를 검색하여 단일 목록으로 결합한 다음 가장 가까운 "k" 을 찾아 결과로 반환합니다.
  • k반환할 결과의 수입니다. 이 숫자는 성능에 직접적인 영향을 미치므로 가능한 한 작게 유지해야 합니다. 이 옵션에 전달된 값은 num_candidates 보다 작아야 합니다.

위 코드에 사용된 설정을 사용하면 가장 잘 일치하는 10개의 결과가 반환됩니다.

이 새 버전의 애플리케이션을 사용해 보실 수 있습니다. 다음은 이러한 유형의 검색이 얼마나 유용한지 알 수 있는 몇 가지 좋은 예입니다:

  • 미국식 영어로 "vacation" 에 해당하는 영국식 영어인 "holiday" 를 검색하면 문서에 holiday라는 단어 자체가 나타나지 않음에도 불구하고 "휴가 정책" 문서가 최상위 결과로 표시됩니다.
  • "고양이와 개" 또는 반려동물과 관련된 다른 용어를 검색하면 문서 요약에 특정 반려동물에 대한 언급이 없더라도 "Office 반려동물 정책" 문서가 최상위 결과로 표시됩니다.

kNN 쿼리에서 필터 사용

이 튜토리얼의 전체 텍스트 섹션에 정의된 대로 검색 쿼리를 사용하면 검색 텍스트의 어느 위치에나 category:<category-name> 구문을 사용하여 특정 카테고리를 사용하도록 요청할 수 있습니다. app.py의 extract_filters() 함수는 검색 쿼리에서 이러한 필터 표현식을 찾아서 분리하는 작업을 담당합니다. 이전 섹션의 handle_search() 함수 버전에서는 filters 변수가 사용되지 않으므로 카테고리 필터가 무시됩니다.

다행히 knn 옵션은 필터링도 지원합니다. 필터 옵션은 실제로 동일한 유형의 필터를 허용하므로 extract_filters() 함수에서 반환되는 것과 똑같이 knn 쿼리에 필터를 직접 삽입할 수 있습니다:

집계는 kNN 쿼리에서도 잘 작동하므로 다시 추가할 수도 있습니다:

이 버전의 handle_search() 기능은 키워드 기반 검색 대신 벡터 검색을 사용하여 구현된 전체 텍스트 검색 버전과 동일한 기능을 가지고 있습니다.

다음 섹션에서는 이 두 가지 다른 검색 방법의 결과를 결합하는 방법에 대해 알아보세요.

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

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

직접 사용해 보세요