Hybrid search with post-filtering
출처: 문서
본문
포스트 필터링을 사용한 하이브리드 검색
Introduced 2.13 {: .label .label-purple }
쿼리에 post_filter 매개변수를 제공하여 하이브리드 검색 결과에 포스트 필터링을 수행할 수 있어요.
post_filter 절은 검색 결과가 검색된 후에 적용돼요. 포스트 필터링은 결과의 점수나 순서에 영향을 주지 않고 검색 결과에 추가 필터를 적용하는 데 유용해요.
포스트 필터링은 집계 결과에 영향을 주지 않아요. {: .note}
최종 결과를 필터링하는 대신 쿼리 실행 중에 모든 하위 쿼리를 필터링하려면 공통 필터를 사용하세요. 자세한 내용은 사전 필터링을 사용한 하이브리드 검색을 참조하세요.
예: 포스트 필터링을 사용한 패싯 검색
포스트 필터링은 UI가 검색 결과와 함께 집계 개수(예: 브랜드, 색상, 크기 필터)를 표시하는 패싯 검색에서 일반적으로 사용돼요. post_filter를 사용하면 표시된 결과만 필터링하면서 전체 필터링되지 않은 쿼리를 기반으로 집계 개수를 유지해요.
제품 문서를 포함하는 인덱스를 고려해 보세요.
{
"name": "Nike Air Max",
"brand": "Nike",
"color": "Red",
"size": 10,
"price": 120,
"category": "Running Shoes"
}
사용자가 "running shoes"를 검색하고, 애플리케이션이 브랜드, 색상, 크기에 대한 집계를 포함하는 쿼리를 구성해요.
POST /products/_search
{
"query": {
"match": {
"category": "running shoes"
}
},
"aggs": {
"brands": {
"terms": { "field": "brand.keyword" }
},
"colors": {
"terms": { "field": "color.keyword" }
},
"sizes": {
"terms": { "field": "size" }
}
}
}
{% include copy-curl.html %}
응답은 모든 브랜드의 결과를 반환해요.
Nike Air Max
Nike Pegasus
Adidas Adizero
Puma Velocity
...
응답은 또한 모든 브랜드, 색상, 크기에 대한 개수를 포함하는 집계를 반환해요.
Brands: Nike (120), Adidas (80), Puma (45)
Colors: Black (90), White (70), Red (55)
Sizes: 8 (40), 9 (60), 10 (85)
집계는 일반적으로 UI에서 패싯 필터로 표시돼요. 사용자가 특정 브랜드(예: Nike)를 선택하여 결과를 필터링할 때, 사전 필터를 사용하면 집계가 계산되기 전에 Nike가 아닌 문서가 제외되어 다른 브랜드가 패싯 개수에서 사라지게 돼요.
post_filter를 사용하면 쿼리와 집계가 전체 결과 집합에 대해 실행돼요. 필터는 표시된 결과에만 적용돼요.
POST /products/_search
{
"query": {
"match": {
"category": "running shoes"
}
},
"aggs": {
"brands": {
"terms": { "field": "brand.keyword" }
},
"colors": {
"terms": { "field": "color.keyword" }
}
},
"post_filter": {
"term": { "brand.keyword": "Nike" }
}
}
{% include copy-curl.html %}
결과에는 Nike 제품만 포함되지만, 집계는 여전히 전체 필터링되지 않은 쿼리를 반영해요.
Brands: Nike (120), Adidas (80), Puma (45)
Colors: Black (90), White (70), Red (55)
모든 브랜드 옵션이 패싯에 계속 표시되어, 사용자가 필터를 제거하지 않고도 브랜드를 전환하거나 개수를 비교할 수 있어요.
포스트 필터링이 검색 결과와 점수에 미치는 영향
포스트 필터링은 최종 검색 결과와 문서 점수를 크게 변경할 수 있어요. 다음 시나리오를 고려해 보세요.
단일 쿼리 시나리오
다음 결과를 반환하는 쿼리를 고려해 보세요.
- 정규화 전 쿼리 결과:
[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으로 변경되는 것을 확인하세요.
다중 쿼리 시나리오
두 개의 하위 쿼리가 있는 쿼리를 고려해 보세요.
- 쿼리 1 결과:
[d2: 5.0, d4: 3.0, d1: 2.0] - 쿼리 2 결과:
[d1: 1.0, d5: 0.5, d4: 0.25] - 정규화된 점수:
- 쿼리 1:
[d2: 1.0, d4: 0.33, d1: 0.0] - 쿼리 2:
[d1: 1.0, d5: 0.33, d4: 0.0]
- 쿼리 1:
- 결합된 초기 점수:
[d2: 1.0, d1: 0.5, d5: 0.33, d4: 0.165]
초기 쿼리 결과에 포스트 필터를 적용한 후 결과는 다음과 같아요.
- 포스트 필터 일치:
[d2, d4] - 결과 점수:
- 쿼리 1:
[d2: 5.0, d4: 3.0] - 쿼리 2:
[d4: 0.25]
- 쿼리 1:
- 정규화된 점수:
- 쿼리 1:
[d2: 1.0, d4: 0.0] - 쿼리 2:
[d4: 1.0]
- 쿼리 1:
- 결합된 최종 점수:
[d2: 1.0, d4: 0.5]
다음 사항을 확인하세요.
- 문서
d2의 점수는 변경되지 않았어요. - 문서
d4의 점수가 변경되었어요.