首页 > 解决方案 > 使用 min_doc_count=0 的弹性搜索聚合返回所有与查询结果或命中无关的存储桶

问题描述

这是我的查询-

{
    "from": 0,
    "size": 100,
    "query": {
        "bool": {
            "filter": [
                {
                    "terms": {
                        "folderId.keyword": [
                            "ff98505e-cdff-43aa-8b05-197bc3f3265e"
                        ],
                        "boost": 1
                    }
                },
                {
                    "terms": {
                        "objectType.keyword": [
                            "File"
                        ],
                        "boost": 1
                    }
                },
                {
                    "term": {
                        "tenantId": {
                            "value": "34202",
                            "boost": 1
                        }
                    }
                }
            ],
            "adjust_pure_negative": true,
            "boost": 1
        }
    },
      "aggs":{
        "_byformat":{
            "terms":{
               "field":"format.keyword",
               "min_doc_count":0,
               "size":200
            }
        }
   }
}

结果 min_doc_count = 0 -

  “接受”:1,
  “超时”:假,
  “_shards”:{
    “总数”:1,
    “成功”:1,
    “跳过”:0,
    “失败”:0
  },
  “命中”:{
    “总数”:3,
    “最大分数”:0.0,
    “命中”:[
      {
        “_index”:“plnesdv1-34202-1”,
        "_type" : "_doc",
        “_id”:“6adbda83-53ad-457f-a2ab-d5b04c643005”,
        “_score”:0.0,
        “_资源” : {
          “格式”:“vnd.openxmlformats-officedocument.spreadsheetml.sheet”,
          “外部共享”:“N”,
          “描述”:空,
          “日期修改”:空,
          “类型”:“应用程序”,
          “文件夹 ID”:“ff98505e-cdff-43aa-8b05-197bc3f3265e”,
          “标签”:[],
          “objectType”:“文件”,
          “创建日期”:空,
          "name" : "新建 XLSX 文件",
          “租户 ID”:“34202”,
          “修改者”:“rdt001”,
          “id”:“6adbda83-53ad-457f-a2ab-d5b04c643005”,
          “状态”:“活动”,
          “过期日期”:空
        }
      },
      {
        “_index”:“plnesdv1-34202-1”,
        "_type" : "_doc",
        “_id”:“b1000a15-2d80-41f4-a5df-ba5c27f8e9c6”,
        “_score”:0.0,
        “_资源” : {
          “格式”:“vnd.ms-excel”,
          “外部共享”:“N”,
          “描述”:空,
          “日期修改”:空,
          “类型”:“应用程序”,
          “文件夹 ID”:“ff98505e-cdff-43aa-8b05-197bc3f3265e”,
          “标签”:[],
          “objectType”:“文件”,
          “创建日期”:空,
          "name" : "新建 XLS 文件",
          “租户 ID”:“34202”,
          “修改者”:“rdt001”,
          “id”:“b1000a15-2d80-41f4-a5df-ba5c27f8e9c6”,
          “状态”:“活动”,
          “过期日期”:空
        }
      },
      {
        “_index”:“plnesdv1-34202-1”,
        "_type" : "_doc",
        "_id" : "630e9f49-3368-408d-a091-03f253127004",
        “_score”:0.0,
        “_资源” : {
          “格式”:“msword”,
          “外部共享”:“N”,
          “描述”:空,
          “日期修改”:空,
          “类型”:“应用程序”,
          “文件夹 ID”:“ff98505e-cdff-43aa-8b05-197bc3f3265e”,
          “标签”:[],
          “objectType”:“文件”,
          “创建日期”:空,
          "name" : "新建 DOC 文件",
          “租户 ID”:“34202”,
          “修改者”:“rdt001”,
          “id”:“630e9f49-3368-408d-a091-03f253127004”,
          “状态”:“活动”,
          “过期日期”:空
        }
      }
    ]
  },
  “聚合”:{
    “_byformat”:{
      “doc_count_error_upper_bound”:0,
      “sum_other_doc_count”:0,
      “桶”:[
        {
          “key”:“msword”,
          “文档计数”:1
        },
        {
          “关键”:“vnd.ms-excel”,
          “文档计数”:1
        },
        {
          "key" : "vnd.openxmlformats-officedocument.spreadsheetml.sheet",
          “文档计数”:1
        },
        {
          “关键”:“bmp”,
          “文档计数”:0
        },
        {
          “关键”:“gif”,
          “文档计数”:0
        },
        {
          “关键”:“html”,
          “文档计数”:0
        }       
      ]
    }
  }
}

结果 min_doc_count = 1 -

{
  "took" : 0,
  "timed_out" : false,
  "_shards" : {
    "total" : 1,
    "successful" : 1,
    "skipped" : 0,
    "failed" : 0
  },
  "hits" : {
    "total" : 3,
    "max_score" : 0.0,
    "hits" : [
      {
        "_index" : "plnesdv1-34202-1",
        "_type" : "_doc",
        "_id" : "6adbda83-53ad-457f-a2ab-d5b04c643005",
        "_score" : 0.0,
        "_source" : {
          "format" : "vnd.openxmlformats-officedocument.spreadsheetml.sheet",
          "externalSharing" : "N",
          "description" : null,
          "dateModified" : null,
          "type" : "application",
          "folderId" : "ff98505e-cdff-43aa-8b05-197bc3f3265e",
          "tags" : [ ],
          "objectType" : "File",
          "dateCreated" : null,
          "name" : "New XLSX file",
          "tenantId" : "34202",
          "modifiedBy" : "rdt001",
          "id" : "6adbda83-53ad-457f-a2ab-d5b04c643005",
          "status" : "active",
          "expirationDate" : null
        }
      },
      {
        "_index" : "plnesdv1-34202-1",
        "_type" : "_doc",
        "_id" : "b1000a15-2d80-41f4-a5df-ba5c27f8e9c6",
        "_score" : 0.0,
        "_source" : {
          "format" : "vnd.ms-excel",
          "externalSharing" : "N",
          "description" : null,
          "dateModified" : null,
          "type" : "application",
          "folderId" : "ff98505e-cdff-43aa-8b05-197bc3f3265e",
          "tags" : [ ],
          "objectType" : "File",
          "dateCreated" : null,
          "name" : "New XLS file",
          "tenantId" : "34202",
          "modifiedBy" : "rdt001",
          "id" : "b1000a15-2d80-41f4-a5df-ba5c27f8e9c6",
          "status" : "active",
          "expirationDate" : null
        }
      },
      {
        "_index" : "plnesdv1-34202-1",
        "_type" : "_doc",
        "_id" : "630e9f49-3368-408d-a091-03f253127004",
        "_score" : 0.0,
        "_source" : {
          "format" : "msword",
          "externalSharing" : "N",
          "description" : null,
          "dateModified" : null,
          "type" : "application",
          "folderId" : "ff98505e-cdff-43aa-8b05-197bc3f3265e",
          "tags" : [ ],
          "objectType" : "File",
          "dateCreated" : null,
          "name" : "New DOC file",
          "tenantId" : "34202",
          "modifiedBy" : "rdt001",
          "id" : "630e9f49-3368-408d-a091-03f253127004",
          "status" : "active",
          "expirationDate" : null
        }
      }
    ]
  },
  "aggregations" : {
    "_byformat" : {
      "doc_count_error_upper_bound" : 0,
      "sum_other_doc_count" : 0,
      "buckets" : [
        {
          "key" : "msword",
          "doc_count" : 1
        },
        {
          "key" : "vnd.ms-excel",
          "doc_count" : 1
        },
        {
          "key" : "vnd.openxmlformats-officedocument.spreadsheetml.sheet",
          "doc_count" : 1
        }
      ]
    }
  }
}

当 min_doc_count = 1 并且仅获取与命中相关的存储桶时,聚合是正确的。

谁能告诉我为什么在设置 min_doc_count = 0 时聚合会获取所有存储桶。我已经浏览了弹性搜索文档,它指出这种行为是设计使然,任何其他方式都可以获取仅针对命中且计数为零的聚合桶。

标签: elasticsearchelasticsearch-aggregation

解决方案


首先,您需要了解看到计数为零的存储桶是什么意思。

以下是术语聚合链接的摘录:

设置 min_doc_count=0 还将返回与任何 hit 不匹配的术语的存储桶。但是,某些文档计数为零的返回术语可能仅属于已删除文档或其他类型的文档,因此无法保证 match_all 查询会找到这些术语的正文档计数。

所以很可能它似乎是已删除文档的计数。

请注意,聚合只会根据查询过滤的文档进行计算。

但是您需要记住,虽然 ES 不断在幕后合并索引段(在删除过程中发生),但 count 为 0 的结果可能会不一致,并且在一段时间内最终可能会(如果没有进一步dos 从那时起被删除)一旦合并过程完成,您可能根本不会得到任何计数为 0 的条款。

因此,在某种程度上,可以安全地对您的业务主管说,他们是已删除文档的计数,您可以将上述论点推给他们。如果他们说他们需要对已删除文档的文档/术语进行计数,这就像在索引中找到一个不存在的文档/术语,甚至没有意义。

根据为什么这仍然显示,这可能是由于 ES 中发生的段合并过程,这是设计使然。

所以不,您不能对已删除的文档应用查询/过滤器(退后一步想象一下),因此您无法控制与最初不可用的文档相关的数据。

聚合查询:

您可以根据评论中提到的要求使用以下聚合:

POST <your_index_name>/_search
{
  "size": 0,
  "aggs": {
    "myaggs_count_zero": {                       <--- Agg for count 0
      "terms": {
        "field": "format.keyword"
      },
      "aggs": {
        "document_counts": {
          "value_count" : {
            "field" : "format.keyword"
          }
        },
        "by_account_filtered": {
          "bucket_selector": {
            "buckets_path": {
              "totalDocs": "document_counts"
            },
            "script": "params.totalDocs == 0"
          }
        }
      }
    },
    "myaggs_count_not_zero": {                  <--- Agg for normal count
      "terms": {
        "field": "format.keyword",
        "min_doc_count": 1
      }
    }
  }
}

请注意,我使用了TermsValue CountBucket Selector Aggregations

这可能不是您想要的,但我希望对您有所帮助!


推荐阅读