[Qdrant] 필터링 기본
Qdrant는 강력하고 유연한 필터 기능을 제공한다.
이를 통해 벡터 검색에서의 사전 필터링을 구현할 수 있고, 혹은 그냥 벡터 검색 없이도 인덱싱으로 꽤 빠르게 값을 가져올 수도 있다. 필터 성능은 Elasticsearch와 비교할 정도는 아니지만 그래도 제법 쓸만하다.
여기서는 필터의 사용법에 대해서 간단히 정리해본다.
관련 포스트
https://blog.naver.com/sssang97/223843531458
https://blog.naver.com/sssang97/223845582216
PUT /collections/clothes
{
"vectors": {
}
}
PUT /collections/clothes/points
{
"points": [
{
"id": 1,
"payload": {"color": "blue", "category":[1], "brand":"GUCCI"},
"vector": {}
},
{
"id": 2,
"payload": {"color": "gray", "category":[2], "brand":"GUCCI"},
"vector": {}
},
{
"id": 3,
"payload": {"color": "red", "category":[3], "brand":"BULDAK"},
"vector": {}
},
{
"id": 4,
"payload": {"color": "yellow", "category":[1, 2], "brand":"YSL"},
"vector": {}
},
{
"id": 5,
"payload": {"color": "yellow", "category":[4], "brand":"NIKE"},
"vector": {}
}
]
}


기본 값 필터 (must 절)
가장 자주 쓰일만한 필터 형태는 이런 식일 것이다.
must 절에는 여러개의 조건절을 부여할 수 있고, 이 경우에는 brand의 값이 GUCCI인 것을 필터했다.
명확한 1:1 매칭이다.
만약 저기서 category가 1인 것만 조회하고 싶다면, must 절에 필터 표현을 하나 더 추가하면 된다. must는 AND 절을 여러개로 묶는 동작을 기본으로 제공한다.
잘 걸러서 가져왔다.
대체로는 must 절만으로도 대부분의 요구사항은 충족할 수 있을 것이다.
should 절
must 절이 명확한 AND 기반의 조건 중첩을 지원한다면, should는 OR 조건 결합을 지원하는 필터 절이다.
must를 쓸때는 2개의 조건에 전부 부합하는 것만 가져왔지만
should는 이렇게 하나라도 충족되면 다 가져온다.
must_not 절
must_not 절은 반대로, 일치하지 않는 것만 가져오는 동작을 지원한다.
예를 들어 이렇게 GUCCI 일치 조건을 주면
일치하지 않는 것만 가져온다.
필터 조건을 여러개를 지정했을 때는 동작 방식이 조금 혼란스러울 수 있다.
저중에 하나라도 일치하는게 있으면, 그건 다 버린다.
그래서 GUCCI와 BULDAK을 제외한 2개만 반환되었다.
any Match
만약 브랜드가 구찌인 것과 BULDAK인 것을 다 조회하고 싶다면 어떻게 해야할까?
위에서 했던 것처럼 should 절로 조건을 나열해도 되지만

any 매치를 사용해서 값을 배열로 전달하는 형태로도 달성 가능하다.

except Match
이건 any 매치와 정반대의 동작을 가지는 매치 조건이다.
배열 목록에서 해당되지 않는 것만 가져온다.

배열과 필터
필터링에서 배열 값은 조금 특수하게 동작한다. 인덱스를 안탄다는건 아니고, 잘 탄다.
예를 들어, 일반 value match에 1를 넣으면
1이 포함된 모든 값을 가져온다. [1,2]도 1에 매치되는 것이다.
그래서 any 절을 걸면 하나라도 겹치는게 있으면 다 가져와버린다.
그런 이유에서 엄밀한 부분집합 쿼리를 사용하려면 그냥 조건 중첩을 해야한다.
이러면 1과 2를 모두 가진 배열만 가져오게 된다.