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

时间:2014-08-27 21:35:09

标签: elasticsearch

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

我目前使用Elasticsearch 1.2.1,但如果有必要,我可以轻松升级。

2 个答案:

答案 0 :(得分: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" : {}
            }
        }

}

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

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

}

这应该会为您提供一个突出显示响应,其中包括匹配文本周围的突出显示以及匹配的字段。

答案 1 :(得分:3)

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

因为突出显示是突出显示后的过程,所以由于它的执行方式而不准确

只需使用命名查询来代替多重匹配

,例如

  {
    "multi_match" : {
      "query" : "query phrase here",
      "fields" : [ "name", "tag", "categorys" ],
      "operator" : "AND"
  }

将其转换为名称为

的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"
               }
            }
        }
     ]

它将返回结果

     {
        "_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"
        ]
     }