ElasticSearch:使用匹配的搜索词标记文档

Rei*_*zar 3 elasticsearch

我正在使用 elasticsearch 1.7,并且需要一种方法来标记文档与它们匹配的 query_string 查询的部分。

我一直在尝试突出显示,但发现在某些情况下它会变得有点混乱。我希望用匹配的搜索词标记该文档。

这是我正在使用的查询:(注意这是一个 ruby​​ 哈希,稍后会被编码为 JSON)

{
  query: {
    query_string: {
      fields: ["title^10", "keywords^4", "content"],
      query: query_string,
      use_dis_max: false
    }
  },
  size: 20,
  from: 0,
  sort: [
    { pub_date: { order: :desc }},
    { _score:   { order: :desc }}
  ]
}
Run Code Online (Sandbox Code Playgroud)

query_string变量基于用户关注的主题,可能如下所示:"(the AND walking AND dead) OR (iphone) OR (video AND games)"

我是否可以使用任何选项,以便返回的文档具有与搜索词匹配的属性,例如the walking dead(the AND walking AND dead)

Val*_*Val 7

如果您准备好切换到使用bool/should查询,则可以拆分每个字段上的匹配并使用命名查询,然后在结果中您将获得匹配的查询的名称。

它基本上是这样的:在bool/should查询中,您query_string为每个字段添加一个查询并命名该查询以便识别该字段(例如,title_query对于该title字段等)

{
  "query": {
    "bool": {
      "should": [
        {
          "query_string": {
            "fields": [
              "title^10"
            ],
            "query": "query_string",
            "use_dis_max": false,
            "_name": "title_query"
          }
        },
        {
          "query_string": {
            "fields": [
              "keywords^4"
            ],
            "query": "query_string",
            "use_dis_max": false,
            "_name": "keywords_query"
          }
        },
        {
          "query_string": {
            "fields": [
              "content"
            ],
            "query": "query_string",
            "use_dis_max": false,
            "_name": "content_query"
          }
        }
      ]
    }
  }
}
Run Code Online (Sandbox Code Playgroud)

在结果中,您将看到_source另一个名为的数组下方matched_queries,其中包含与返回的文档匹配的查询名称。

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