我在文档中有3个字段需要匹配。我想确定这三个字段中哪一个有匹配。
更具体地说,我想知道给定的通配符查询是否只匹配文档集中的一个字段或匹配多个字段。如果通配符查询仅匹配,例如field1
,那么我可以得出结论:给定的通配符查询仅适用于field1
。如果通配符查询匹配两个或三个字段,那么我无法做出这样的结论,我将等待用户输入更多字符以缩小搜索范围。
我编写了以下与所有3个字段匹配的查询:
{
"query": {
"bool": {
"should": [
{"wildcard": { "field1": "*R*" }},
{"wildcard": { "field2": "*R*" }},
{"wildcard": { "field3": "*R*" }}
]
}
},
"size": 0
}
它返回在任何这些字段上匹配的所有文档的总数。现在,我想知道每个子查询是否可以获得3个单独的计数。这可以通过发送3个单独的请求来实现,但我希望尽量减少对弹性搜索的请求数量。
我已经尝试了bool
和dis_max
个查询但无法找到解决方案。
使用named queries我构建了以下查询:
{
"query": {
"bool": {
"should": [
{"wildcard": { "field1": { "value": "*R*", "_name": "query1" }}},
{"wildcard": { "field2": { "value": "*R*", "_name": "query2" }}},
{"wildcard": { "field3": { "value": "*R*", "_name": "query3" }}}
]
}
},
"size": 1
}
此查询返回具有最佳分数的单个结果。默认情况下,当在同一文档中匹配更多字段时,分数会更高。因此,如果找到的文档与两个或三个字段匹配,则它已经回答了我的初始问题。但是,如果找到的文档与单个字段匹配,例如field1
,则不能保证没有其他文档可以与field2
或field3
匹配,因此它&#39 ; s仍然不是解决方案。
我是否必须分别发送3个请求才能分别对每个字段进行搜索以解决我的问题?