我一直在尝试使用ES做一件非常简单的事情,并且只能通过一种变通方法进行管理: 给定一个查询和一个文档字段,将所有查询的术语与所有字段的术语匹配。 换句话说:
在匹配查询中使用and
运算符可以满足要求1)。但是我找不到2)的方法。
到目前为止,我设法做到这一点的唯一方法是利用highlight
并要求突出显示所有字符串(在我的应用程序逻辑中)
还有另一种方法吗?
示例:
PUT bananas/banana/1
{ "name" : "banana"}
PUT bananas/banana/2
{ "name" : "ripe banana"}
PUT bananas/banana/3
{ "name" : "not so ripe banana"}
GET bananas/_search
{
"query" : {
"match": { "_all": { "query": "ripe banana", "operator": "and" } }
},
"highlight" : {
"fields" : { "*" : { } },
"require_field_match": false
}
}
# Result (hits only):
"hits" : {
"hits" : [
{
"_index" : "bananas",
"_type" : "banana",
"_id" : "3",
"_score" : 0.5753642,
"_source" : {
"name" : "not so ripe banana"
},
"highlight" : {
"name" : [
"not so <em>ripe</em> <em>banana</em>"
]
}
},
{
"_index" : "bananas",
"_type" : "banana",
"_id" : "2",
"_score" : 0.51623213,
"_source" : {
"name" : "ripe banana"
},
"highlight" : {
"name" : [
"<em>ripe</em> <em>banana</em>"
]
}
}
]
}
因此,在这种情况下,我想排除“不太成熟的香蕉”的结果(由于某种原因,它甚至首先返回!)。
我的解决方法是检查响应的highlight
部分,看是否有未突出显示的内容