带后过滤的混合搜索
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
。
多查询场景
考虑一个包含两个子查询的查询
- 查询 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
的分数已更改。