我在三个字段上使用典型的多匹配查询:名称,城市,州。多匹配查询也使用Java函数分数脚本。有什么方法可以在得分脚本中知道哪些字段匹配我的多重匹配查询?如果没有,有没有办法从SearchResponse对象中解决这个问题?
我目前使用Elasticsearch 1.2.1,但如果有必要,我可以轻松升级。
答案 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"
]
}