본문 바로가기
WIKI 기술 지식 베이스

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 %}

더 알아보기 (Learn more)