【发布时间】:2014-08-27 21:35:09
【问题描述】:
我在三个字段上使用典型的多重匹配查询:姓名、城市、州。多重匹配查询也使用 Java 函数评分脚本。有什么方法可以在分数脚本中知道哪些字段与我的多匹配查询匹配?如果没有,有什么方法可以从 SearchResponse 对象中解决这个问题?
我目前使用的是 Elasticsearch 1.2.1,但如有必要,我可以轻松升级。
【问题讨论】:
标签: elasticsearch
我在三个字段上使用典型的多重匹配查询:姓名、城市、州。多重匹配查询也使用 Java 函数评分脚本。有什么方法可以在分数脚本中知道哪些字段与我的多匹配查询匹配?如果没有,有什么方法可以从 SearchResponse 对象中解决这个问题?
我目前使用的是 Elasticsearch 1.2.1,但如有必要,我可以轻松升级。
【问题讨论】:
标签: elasticsearch
我不相信你可以直接使用多重匹配来做到这一点,但如果你添加突出显示,你应该会得到一个显示哪些字段匹配的响应:
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": {}
}
}
}
这应该会为您提供一个突出显示响应,其中包括匹配文本周围的突出显示和匹配的字段。
【讨论】:
还有另一种准确的方法可以找出查询中匹配的字段
因为高亮是后期高亮过程,所以不准确,因为它这样做的方式
只需使用命名查询来代替多重匹配
比如
{
"multi_match" : {
"query" : "query phrase here",
"fields" : [ "name", "tag", "categorys" ],
"operator" : "AND"
}
将其翻译成带有名称的布尔查询
"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"
]
}
【讨论】: