为啥我的 Elasticsearch 查询检索所有索引文档

Posted

技术标签:

【中文标题】为啥我的 Elasticsearch 查询检索所有索引文档【英文标题】:Why my Elasticsearch query retrieves all indexed documents为什么我的 Elasticsearch 查询检索所有索引文档 【发布时间】:2019-02-12 09:34:16 【问题描述】:

我无法理解以下 Elasticsearch (ES 6.4) 查询的功能:


    "query" : 
        "bool" : 
            "should" : [
                
                    "match" : 
                        "title" : 
                            "query" : "example",
                            "operator" : "AND",
                            "boost" : 2
                        
                    
                ,
                
                    "multi_match" : 
                        "type" : "best_fields",
                        "query" : "example",
                        "operator" : "AND",
                        "fields" : [
                            "author", "content", "tags"
                        ],
                        "boost" : 1
                    
                
            ],
            "must" : [
                
                    "range" : 
                        "dateCreate" : 
                            "gte" : "2000-01-01T00:00:00+0200",
                            "lte" : "2019-02-12T23:59:59+0200"
                        
                    
                ,
                
                    "term" : 
                        "client" : 
                            "value" : "test",
                            "boost" : 1
                        
                    
                
            ]
        
    ,
    "size" : 10,
    "from" : 0,
    "sort" : [
        
            "_score" : 
                "order" : "desc"
            
        
    ]

查询成功执行,但检索到大约 400,000 个文档,这是我的索引的总数。这意味着所有文档都在结果集中。但为什么?这真的是 multi_match 查询的正确行为吗? 当我还在使用 query_string 查询时,我只得到了实际匹配的文档。这就是为什么我有点惊讶。

【问题讨论】:

【参考方案1】:

你错过了minimum_should_match

    "bool" : 
        "minimum_should_match": 1,            <--- add this
        "should" : [
           ...

【讨论】:

但也有must 子句,因此即使should 子句中的查询都不匹配,也应根据该条件过滤文档(除非该条件与所有文档匹配)。 minimum_should_match 会以某种方式影响should 子句中的至少一个应该匹配。 那么显然,这两个 must 子句匹配所有文档,因为我怀疑所有文档都包含 example 令牌。如果没有minimum_should_match,这两个 should 子句仅用作排名助推器。 这样搜索词肯定不会出现在所有文档中,所以查询有问题。我现在将 minimum_should_match 设置为 1 并且只得到四分之一的结果,这在我看来太多了。如果我将 minium_should_match 设置为 2,我可以将结果集限制为 4,000。但是效果我不太明白。 @altralaser 当您完全删除 should 子句并且查询只有 must 子句时会发生什么? 措辞不同,您希望在这些条件下有多少文档?即当你使用query_string 查询时你得到了多少。另请分享该查询以及您更改的原因。

以上是关于为啥我的 Elasticsearch 查询检索所有索引文档的主要内容,如果未能解决你的问题,请参考以下文章

Elasticsearch搜索查询以检索所有记录NEST

四.全文检索ElasticSearch经典入门-ElasticSearch DSL查询

Elasticsearch 检索相关

elasticSearch - 高级检索

全文检索-Elasticsearch DSL

Elasticsearch-Query DSL