https://docs.opensearch.org/latest/vector-search/ai-search/hybrid-search/inner-hits/
2.13 버전에서 도입됨
쿼리에 post_filter 매개변수를 제공하여 하이브리드 검색 결과에 사후 필터링을 수행할 수 있습니다.
post_filter 절은 검색 결과가 검색된 후에 적용됩니다. 사후 필터링은 점수 매기기나 결과 순서에 영향을 주지 않고 검색 결과에 추가 필터를 적용하는 데 유용합니다.
사후 필터링은 문서 관련성 점수나 집계 결과에 영향을 주지 않습니다.
다음 예제 요청은 두 개의 쿼리 절(term 쿼리와 match 쿼리)을 결합하고 post_filter를 포함합니다:
GET /my-nlp-index/_search?search_pipeline=nlp-search-pipeline
{
"query": {
"hybrid":{
"queries":[
{
"match":{
"passage_text": "hello"
}
},
{
"term":{
"passage_text":{
"value":"planet"
}
}
}
]
}
},
"post_filter":{
"match": { "passage_text": "world" }
}
}
사후 필터링이 없는 예제의 결과와 비교해보세요. 사후 필터링이 없는 예제에서는 응답이 두 개의 문서를 포함합니다. 이 예제에서는 두 번째 문서가 필터링되어 응답이 하나의 문서를 포함합니다:
{
"took": 18,
"timed_out": false,
"_shards": {
"total": 2,
"successful": 2,
"skipped": 0,
"failed": 0
},
"hits": {
"total": {
"value": 1,
"relation": "eq"
},
"max_score": 0.3,
"hits": [
{
"_index": "my-nlp-index",
"_id": "1",
"_score": 0.3,
"_source": {
"id": "s1",
"passage_text": "Hello world"
}
}
]
}
}
사후 필터링은 최종 검색 결과와 문서 점수를 크게 변경할 수 있습니다. 다음 시나리오를 고려해보세요.
다음 결과를 반환하는 쿼리를 고려해보세요:
[d2: 5.0, d4: 3.0, d1: 2.0][d2: 1.0, d4: 0.33, d1: 0.0]초기 쿼리 결과에 사후 필터를 적용한 후 결과는 다음과 같습니다:
[d2, d4][d2: 1.0, d4: 0.0]사후 필터를 적용한 후 문서 d4의 점수가 0.33에서 0.0으로 변경된 것을 주목하세요.
두 개의 하위 쿼리가 있는 쿼리를 고려해보세요:
[d2: 5.0, d4: 3.0, d1: 2.0][d1: 1.0, d5: 0.5, d4: 0.25][d2: 1.0, d4: 0.33, d1: 0.0][d1: 1.0, d5: 0.33, d4: 0.0][d2: 1.0, d1: 0.5, d5: 0.33, d4: 0.165]초기 쿼리 결과에 사후 필터를 적용한 후 결과는 다음과 같습니다:
[d2, d4][d2: 5.0, d4: 3.0][d4: 0.25][d2: 1.0, d4: 0.0][d4: 1.0][d2: 1.0, d4: 0.5]다음을 관찰할 수 있습니다:
d2의 점수는 변경되지 않았습니다.d4의 점수가 변경되었습니다.// 예시: 전자상거래 검색
{
"query": {
"hybrid": {
"queries": [
{"match": {"product_name": "노트북"}},
{"neural": {"description_vector": {...}}}
]
}
},
"post_filter": {
"range": {"price": {"gte": 500000, "lte": 1500000}}
}
}
// 상품 검색 + 재고/배송 필터링
"post_filter": {
"bool": {
"must": [
{"term": {"in_stock": true}},
{"term": {"fast_shipping": true}}
]
}
}
// 문서 검색 + 권한/지역 필터링
"post_filter": {
"bool": {
"must": [
{"term": {"access_level": "public"}},
{"term": {"region": "KR"}}
]
}
}
// 개인 취향 반영하면서 기본 검색 품질 유지
"post_filter": {
"bool": {
"should": [
{"term": {"user_preference": "electronics"}},
{"range": {"user_rating": {"gte": 4.0}}}
]
}
}
사후 필터링은 특히 검색 품질을 해치지 않으면서 비즈니스 요구사항을 반영해야 하는 상황에서 매우 유용한 도구입니다.