找出多匹配查询中匹配的字段

Com*_*der 5 elasticsearch

我在三个字段上使用典型的多匹配查询:名称,城市,州.多匹配查询也使用Java函数分数脚本.有什么方法可以在得分脚本中知道哪些字段匹配我的多重匹配查询?如果没有,有没有办法从SearchResponse对象中解决这个问题?

我目前在Elasticsearch 1.2.1上,但如果有必要,我可以轻松升级.

Joh*_*one 6

我不相信你可以直接使用多重匹配来做到这一点,但是如果你添加突出显示,你应该得到一个响应,显示哪些字段匹配:

http://www.elasticsearch.org/guide/en/elasticsearch/guide/current/highlighting-intro.html

在此页面的示例中:

    GET /megacorp/employee/_search
    {
        "query" : {
            "match_phrase" : {
                "about" : "rock climbing"
            }
        },
        "highlight": {
            "fields" : {
                "about" : {}
            }
        }

}
Run Code Online (Sandbox Code Playgroud)

您可以将match_phrase更改为multi_match并添加字段列表:

    GET /megacorp/employee/_search
    {
        "query" : {
            "multi_match" : {
                "query" : "rock climbing",
                "fields": ["about", "otherfield"]
            }
        },
        "highlight": {
            "fields" : {
                "about" : {},
                 "otherfield": {}
            }
        }

}
Run Code Online (Sandbox Code Playgroud)

这应该会得到一个突出显示响应,其中包括匹配文本周围的突出显示和匹配的字段.


小智 5

还有另一种确切的方法来找出查询中匹配的字段

因为突出显示是突出显示后的过程,所以它的准确性不高

只需使用命名查询即可,而不是多次匹配

  {
    "multi_match" : {
      "query" : "query phrase here",
      "fields" : [ "name", "tag", "categorys" ],
      "operator" : "AND"
  }
Run Code Online (Sandbox Code Playgroud)

将其翻译为名称为bool的查询

    "should": [
        {
            "match": {
               "name": {
                    "query": "query phrase here",
                    "_name":"name_field"
               }
            }
        },{
            "match": {
               "tag":{
                    "query": "query phrase here",
                    "_name":"tag_field"
               }
            }   
        },{
            "match": {
               "categorys":{
                    "query": "query phrase here",
                    "_name":"cat_field"
               }
            }
        }
     ]
Run Code Online (Sandbox Code Playgroud)

它会返回这样的结果

     {
        "_index": "indexName",
        "_type": "type",
        "_id": "id",
        "_score": 0.27836448,
        "matched_queries": [
           "tag_field"
        ]
     },
     {
        "_index": "indexName",
        "_type": "type",
        "_id": "id",
        "_score": 0.27836448,
        "matched_queries": [
           "name_field",
           "tag_field"
        ]
     }
Run Code Online (Sandbox Code Playgroud)