在elasticsearch结果中显示不匹配的词

paw*_*que 4 match elasticsearch

我想显示哪些词与返回文档的多词查询不匹配。是否有查询类型或参数来实现这一点?

通常,此类不匹配的单词会以删除线字体显示给用户:

漏词


得到答案后的示例查询:

POST /posts/_search
{
   "query": {
      "bool": {
         "should": [
            {"match": {"name": {"query": "jogging rain"}}},
            {"match": {"name": {"query": "jogging", "_name": "jogging"}}},
            {"match": {"name": {"query": "rain", "_name": "rain"}}}
         ]
      }
   }
}
Run Code Online (Sandbox Code Playgroud)

现在,如果我们找到一个包含单词jogging但不包含 的文档rain,我们会得到如下结果:

{
    "_source": {
        "name": "jogging"
    },
    "matched_queries": [
        "jogging"
    ]
}
Run Code Online (Sandbox Code Playgroud)

然后在下一步中,我从初始搜索中减去matched_queries, ie的内容,即结果:就是我想要的。"jogging""jogging rain""rain"

感谢@Val 关于如何解决这个问题的想法!

Val*_*Val 5

您可以为此使用命名查询,方法是为每个查询命名。在结果中,每个命中都将包含一个matched_queries包含匹配的查询名称的数组(例如unmatched_querystrikethrough_query以下)。然后,您可以在客户端使用该信息来构建不匹配的单词的删除线列表。

{
  "query": {
    "bool": {
      "should": [
        {
          "match": {
            "content": {
              "query": "unmatched",
              "_name": "unmatched_query"
            }
          }
        },
        {
          "match": {
            "content": {
              "query": "strikethrough",
              "_name": "strikethrough_query"
            }
          }
        }
      ]
    }
  }
}
Run Code Online (Sandbox Code Playgroud)