ElasticSearch-布尔查询过滤器出现问题

如何解决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字段上执行必须查询时,如果过滤器完全匹配,我不会得到相同的结果。

这里是一个例子:

  1. 仅使用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
                }
            }
        ]
    }
}
  1. 使用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查询有关,如果您在顶级查询,则有两个结构

  1. 具有3个应有条件的过滤器块,其中至少1个应与之匹配,这将进行过滤,即减少执行下一个must子句的文档集。

  2. 必须阻止,我怀疑步骤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 举报,一经查实,本站将立刻删除。

相关推荐


Selenium Web驱动程序和Java。元素在(x,y)点处不可单击。其他元素将获得点击?
Python-如何使用点“。” 访问字典成员?
Java 字符串是不可变的。到底是什么意思?
Java中的“ final”关键字如何工作?(我仍然可以修改对象。)
“loop:”在Java代码中。这是什么,为什么要编译?
java.lang.ClassNotFoundException:sun.jdbc.odbc.JdbcOdbcDriver发生异常。为什么?
这是用Java进行XML解析的最佳库。
Java的PriorityQueue的内置迭代器不会以任何特定顺序遍历数据结构。为什么?
如何在Java中聆听按键时移动图像。
Java“Program to an interface”。这是什么意思?
Java在半透明框架/面板/组件上重新绘画。
Java“ Class.forName()”和“ Class.forName()。newInstance()”之间有什么区别?
在此环境中不提供编译器。也许是在JRE而不是JDK上运行?
Java用相同的方法在一个类中实现两个接口。哪种接口方法被覆盖?
Java 什么是Runtime.getRuntime()。totalMemory()和freeMemory()?
java.library.path中的java.lang.UnsatisfiedLinkError否*****。dll
JavaFX“位置是必需的。” 即使在同一包装中
Java 导入两个具有相同名称的类。怎么处理?
Java 是否应该在HttpServletResponse.getOutputStream()/。getWriter()上调用.close()?
Java RegEx元字符(。)和普通点?