如何解决ElasticSearch-布尔查询过滤器出现问题
我在布尔查询中遇到了过滤器问题。
我想基于3个字段应用一个过滤条件为1的最小过滤条件:
$params = [
'from' => 0,'size' => 25,'index' => 'document','body' => [
'query' => [
'bool' => [
'filter' => [
'bool' => [
'minimum_should_match' => 1,'should' => [
'term' => [
'VISIBILITE' => 'T'
],'term' => [
'ECRITURE' => 'M'
],'term' => [
'LECTURE' => 'M'
],]
]
],'must' => [
[
'bool' => [
'should' => [
[
'match' => [
'OBJET' => $recherche,]
],]
]
],],];
此查询没有结果,但是索引中有很多相关文档。
Opster Elasticsearch Ninja测试:
例如您向我提出的示例1,我得到了很多返回结果。
但是,当我想在OBJECT字段上执行必须查询时,如果过滤器完全匹配,我不会得到相同的结果。
这里是一个例子:
- 仅使用must子句进行搜索
{
"took": 8,"timed_out": false,"_shards": {
"total": 2,"successful": 2,"skipped": 0,"Failed": 0
},"hits": {
"total": {
"value": 1268,"relation": "eq"
},"max_score": 13.616098,"hits": [
{
"_index": "document","_type": "_doc","_id": "26685","_score": 13.616098,"_source": {
"NUMDOCUMENT": "26685","TYPEDOCUMENT": "Proc\u00e9dure","OBJET": "Proc\u00e9dure d'importation des index dans marco 2","MOTCLES": "","LECTURE": "S","VISIBILITE": "T",// Must match on second search
"ECRITURE": "M" // Must match on second search
}
}
]
}
}
- 使用must子句进行搜索并进行过滤
{
"took": 9,"hits": {
"total": {
"value": 10000,"relation": "gte"
},"max_score": 0,"_id": "431","_score": 0,"_source": {
"NUMDOCUMENT": "431","TYPEDOCUMENT": "Document","OBJET": "Diagnostic informatique SAFC","LECTURE": "M","ECRITURE": "M"
}
}
]
}
}
不再是第一个出现的文档(尽管该文档与过滤器相对应)。好像搜索过滤器会影响搜索结果的分数和相关性。
解决方法
问题似乎与您的bool
查询有关,如果您在顶级查询,则有两个结构
-
具有3个应有条件的过滤器块,其中至少1个应与之匹配,这将进行过滤,即减少执行下一个
must
子句的文档集。 -
必须阻止,我怀疑步骤1的精简文档集上没有任何内容匹配,这导致查询不返回任何内容。
为了调试问题,您应该独立尝试第一个块,然后再进行合并以查看是否获得结果,因为您的must
块没有适当的数据,我已经在下面的示例中创建,该示例显示您是否有适当的数据,它将返回数据:
{
"query": {
"bool": {
"should": [
{
"term": {
"VISIBILITE": "T"
}
},{
"term": {
"ECRITURE": "T"
}
},{
"term": {
"LECTURE": "T"
}
}
],"minimum_should_match": 1
}
}
}
然后搜索查询结果,显示匹配文档的_source
"hits": [
{
"_index": "minshouldmatch","_type": "_doc","_id": "2","_score": 1.5686158,"_source": {
"VISIBILITE": "T","ECRITURE": "T","LECTURE": "T"
}
},{
"_index": "minshouldmatch","_id": "1","_score": 0.18232156,// note even only 1 condition matches still it comes in SR
"ECRITURE": "M","LECTURE": "M"
}
}
]
,
我找到了解决方案。我忘了应该过滤的钩子。
不好:
'bool' => [
'filter' => [
'bool' => [
'minimum_should_match' => 1,'should' => [
'term' => [
'VISIBILITE' => 'T'
],'term' => [
'ECRITURE' => 'M'
],'term' => [
'LECTURE' => 'M'
],]
]
],
好:
'bool' => [
'filter' => [
'bool' => [
'minimum_should_match' => 1,'should' => [[ // Double hook
'term' => [
'VISIBILITE' => 'T'
],]]
]
],
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。