首页 > 解决方案 > elasticsearch 术语聚合不正确

问题描述

我有一个存储字符串数组的字段。不同的文档包含不同的字符串集。

ex: "ftypes": ["PDF", "TXT", "XML"]

现在我使用这个聚合查询来分析每种文件类型的使用情况。

{
  "aggs": {
    "list": {
      "terms": {
        "field": "ftypes",
        "min_doc_count": 0,
        "size": 100000
      }
    }
  }
}

result ==>
{
    "took": 11,
    "timed_out": false,
    "_shards": {
        "total": 5,
        "successful": 5,
        "skipped": 0,
        "failed": 0
    },
    "hits": {
        "total": 137265,
        "max_score": 0.0,
        "hits": []
    },
    "aggregations": {
        "list": {
            "doc_count_error_upper_bound": 0,
            "sum_other_doc_count": 0,
            "buckets": [
                {
                    "key": "PDF",
                    "doc_count": 134475
                },
                {
                    "key": "TXT",
                    "doc_count": 21312
                },
                {
                    "key": "XML",
                    "doc_count": 6597
                },
                {
                    "key": "JPG",
                    "doc_count": 1233
                }
            ]
        }
    }
}

结果和预期的一样正确。但最近我在删除 XML 文件支持后更新了这个字段。所以文档中没有一个文件类型为 XML。我可以从这个查询中确认。

{
  "query": {
    "terms": {
      "ftypes": ["XML"]
    }
  }
}

result ===>

{
    "took": 1,
    "timed_out": false,
    "_shards": {
        "total": 5,
        "successful": 5,
        "skipped": 0,
        "failed": 0
    },
    "hits": {
        "total": 0,
        "max_score": null,
        "hits": []
    }
}

总点击数为零。奇怪的是,当我再次执行上述聚合查询时,我可以将 XML 视为一个术语。文档计数为零。

{
    "took": 11,
    "timed_out": false,
    "_shards": {
        "total": 5,
        "successful": 5,
        "skipped": 0,
        "failed": 0
    },
    "hits": {
        "total": 137265,
        "max_score": 0.0,
        "hits": []
    },
    "aggregations": {
        "list": {
            "doc_count_error_upper_bound": 0,
            "sum_other_doc_count": 0,
            "buckets": [
                {
                    "key": "PDF",
                    "doc_count": 134475
                },
                {
                    "key": "TXT",
                    "doc_count": 21312
                },
                {
                    "key": "JPG",
                    "doc_count": 1233
                },
                {
                    "key": "XML",
                    "doc_count": 0
                }
            ]
        }
    }
}

如果它在任何文档中都不存在,那么这个 XML 术语现在来自哪里?有没有我需要删除的缓存?

标签: elasticsearch

解决方案


我建议你参考这个

ES 在后台使用 Lucene。他们被称为ghost terms。这里,XML是索引中的一个幽灵术语。

用于查询评分的聚合术语统计信息仍将反映已删除的术语和文档。当合并完成时,术语统计数据会突然跳到更接近其真实值,从而改变命中分数。实际上,这种影响很小,除非删除的文档与索引的其余部分具有不同的统计信息。

所有后续搜索都只是跳过任何已删除的文档。直到段被合并,被删除的文档消耗的字节才被回收。同样,仅在已删除文档中出现的任何术语(幽灵术语)在合并之前都不会被删除。

该链接有足够的理由进行此过程。

为避免输出中出现该术语,您需要设置min_doc_count:1,它将获取包含至少一个文档的文档


推荐阅读