elasticsearch - 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 术语现在来自哪里?有没有我需要删除的缓存?
解决方案
我建议你参考这个
ES 在后台使用 Lucene。他们被称为ghost terms
。这里,XML
是索引中的一个幽灵术语。
用于查询评分的聚合术语统计信息仍将反映已删除的术语和文档。当合并完成时,术语统计数据会突然跳到更接近其真实值,从而改变命中分数。实际上,这种影响很小,除非删除的文档与索引的其余部分具有不同的统计信息。
所有后续搜索都只是跳过任何已删除的文档。直到段被合并,被删除的文档消耗的字节才被回收。同样,仅在已删除文档中出现的任何术语(幽灵术语)在合并之前都不会被删除。
该链接有足够的理由进行此过程。
为避免输出中出现该术语,您需要设置min_doc_count:1
,它将获取包含至少一个文档的文档
推荐阅读
- android - What information can my server get about an app's in-app purchases?
- python - Jupyter Notebook 中的流式网格显示
- javascript - Node FTP 从一台服务器下载文件并上传到另一台服务器
- swift - Xcode 10.1 ImageRow 问题
- performance - 您如何监控浏览器扩展的性能?
- vb.net - 如何使用按钮打印具有文本框和图形的 TabPage?
- git - Git:有一个文件显示它是否已更改,无论我是否删除它,我怎样才能让它保持不变?
- java - 在 JList 中显示文件对象的简单名称
- c - 链表 - 命令行参数
- python - 在无 Internet 的服务器上复制 python Anaconda 库