Link Search Menu Expand Document Documentation Menu

带后过滤的混合搜索

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]
  • 合并初始分数:[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:[d2: 1.0, d4: 0.0]
    • 查询 2:[d4: 1.0]
  • 合并最终分数:[d2: 1.0, d4: 0.5]

请注意

  • 文档 d2 的分数保持不变。
  • 文档 d4 的分数已更改。
剩余 350 字符

有问题?

想贡献?