Hybrid search with pre-filtering
출처: 문서
본문
Hybrid search with pre-filtering
3.0에서 도입 {: .label .label-purple }
하이브리드 검색 결과에 사전 필터링을 수행하려면 hybrid 쿼리에 최상위 filter 매개변수를 제공하면 돼요.
filter는 쿼리 실행 중 각 하위 쿼리에 적용되어 필터와 일치하는 문서만 점수가 매겨져요. 사전 필터링은 각 하위 쿼리에 필터를 중복하지 않고 모든 하위 쿼리에 동일한 필터를 적용할 때 유용해요.
filter는 단일 쿼리 객체여야 해요.
{: .note}
실행 중 각 하위 쿼리를 필터링하는 대신 검색된 후 최종 결과를 필터링하려면 사후 필터를 사용하면 돼요. 자세한 내용은 사후 필터링을 사용한 하이브리드 검색을 참조하세요.
예시
다음 예시 요청은 match 쿼리와 knn 쿼리를 결합하고 두 하위 쿼리를 모두 shoes 카테고리로 제한하는 공통 filter를 적용해요.
POST /products/_search?search_pipeline=nlp-search-pipeline
{
"query": {
"hybrid": {
"filter": {
"term": { "category": "shoes" }
},
"queries": [
{
"match": { "description": "running shoes" }
},
{
"knn": {
"embedding": {
"vector": [1.23, 0.45, 0.67, ...],
"k": 10
}
}
}
]
}
}
}
{% include copy-curl.html %}
OpenSearch는 category: shoes 필터를 match와 knn 하위 쿼리 모두에 적용하는데, 이는 각 하위 쿼리에 개별적으로 필터를 적용하는 다음 쿼리와 동일해요.
POST /products/_search?search_pipeline=nlp-search-pipeline
{
"query": {
"hybrid": {
"queries": [
{
"bool": {
"must": {
"match": { "description": "running shoes" }
},
"filter": {
"term": { "category": "shoes" }
}
}
},
{
"knn": {
"embedding": {
"vector": [1.23, 0.45, 0.67, ...],
"k": 10,
"filter": {
"term": { "category": "shoes" }
}
}
}
}
]
}
}
}
{% include copy-curl.html %}
여러 조건에 대한 필터링
filter는 단일 쿼리 객체여야 하므로 여러 조건을 Boolean 쿼리를 사용하여 결합해요. 다음 예시는 결과를 재고가 있는 신발로만 필터링해요.
"filter": {
"bool": {
"must": [
{ "term": { "category": "shoes" }},
{ "term": { "in_stock": true }}
]
}
}
공통 필터와 하위 쿼리 필터 결합
하위 쿼리는 공통 필터 외에 자체 필터를 정의할 수 있어요. 이 경우 OpenSearch는 논리적 AND를 사용하여 두 필터를 결합하여 해당 하위 쿼리의 결과를 더 좁혀요.
다음 예시에서 공통 필터는 모든 하위 쿼리를 shoes 카테고리로 제한하고, match 하위 쿼리는 추가로 nike 브랜드로 좁혀져요.
POST /products/_search?search_pipeline=nlp-search-pipeline
{
"query": {
"hybrid": {
"filter": {
"term": { "category": "shoes" }
},
"queries": [
{
"bool": {
"must": {
"match": { "description": "running shoes" }
},
"filter": {
"term": { "brand": "nike" }
}
}
},
{
"knn": {
"embedding": {
"vector": [1.23, 0.45, 0.67, ...],
"k": 10
}
}
}
]
}
}
}
{% include copy-curl.html %}