[Opensearch] 벡터 검색과 필터링 (Filtering)

[원본 링크]

가장 좋은 것은 필터링 없이 벡터에 대한 유사도만 검색하는 것이지만, 그게 힘든 경우가 많다.
Opensearch는 벡터 검색에 대한 사전 필터링과 사후 필터링을 모두 지원한다.




사후 필터링

만약 vector search, knn 절과 다른 필터 조건 등을 bool로 엮어서 넣는다면, 이건 순진한 형태의 사후 필터링이 된다.

이게 무슨 말이냐면, 실제로 가져올 수 있는 것이 60개 있더라도, 벡터 검색으로 60개를 가져온 다음에 필터링을 수행하기 때문에 그보다 적은 개수를 가져올 수 있다는 것이다.

그래서 이 경우에도 겨우 4개밖에 나오지 않는다.





사전 필터링 (Pre Filtering)

knn 절에 filter 절을 구겨넣으면 벡터 검색과 동시에 필터가 실행되도록 할 수 있다.

그러면 원하는 300개를 그대로 다 가져왔다.

Opensearch에서는 이걸 Efficient k-NN filtering라고 부른다.
HNSW 노드를 여행하는 도중에 실시간으로 필터링으로 배제를 처리하는 방식이다.

하지만 Qdrant처럼 여행 중에 추가 엣지를 사용하거나 하진 않기 때문에, 이것도 Qdrant의 Filterable Index에 비하면 실제 값보다 덜 가져올 확률이 높다. 노드를 충분히 방문하지 못할 수 있기 때문이다.



참조
https://docs.opensearch.org/latest/vector-search/filter-search-knn/efficient-knn-filtering/
https://docs.opensearch.org/latest/vector-search/filter-search-knn/index/