当前位置: 首页 > 知识库问答 >
问题:

elasticsearch术语聚合不正确

邢良才
2023-03-14

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

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文件支持后更新了此字段。因此,文档的non具有文件类型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视为一个术语。doc count为零。

{
    "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术语在任何文档中都不存在,那么它现在来自哪里?。是否有需要删除的缓存?

共有1个答案

游皓
2023-03-14

我建议你参考这个

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

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

链接对此过程有足够的理由。

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

 类似资料:
  • 问题内容: 我正在尝试使用以下查询对以下数据进行elasticsearch来执行术语聚合,输出将名称分解为标记(请参见下面的输出)。因此,我尝试将os_name映射为multi_field,但现在无法通过它查询。是否可以有没有令牌的索引?例如“ Fedora Core”? 查询: 数据: 输出: 映射: 问题答案: 实际上,您应该像这样更改映射 并且您的aggs应该更改为:

  • 我们目前正在开发一个多语言文档CMS。因此,我们有翻译成不同语言的文件。 对于使用Elasticsearch进行搜索,我们目前使用每种语言(德语、英语、法语……)一个索引,其中同一文档的所有翻译共享相同的ID。 当用户搜索特定术语时,我们希望在所有语言中搜索,但只返回不同ID的列表。据我所知,只有使用以下术语聚合才能做到这一点: 这很好,但是作为弹性搜索文档https://www.elastic.

  • 问题内容: 我有两种日志消息: 第一个消息是已发送消息的类型,第二个消息是确认消息已传递的消息。 它们之间的区别是后缀,我已将其与“ id”分开并可以对其进行查询。 这些消息将按以下格式解析并存储在elasticsearch中: 我想找出哪些消息已成功发送,哪些没有成功。我是Elasticsearch的初学者,所以我真的很努力。 我目前正在尝试术语聚合,但是我所能实现的就是以下代码: 向我显示已发

  • 我试图在关键字类型字段上进行不区分大小写的聚合,但在使其工作时遇到了问题。 到目前为止,我尝试的是添加一个名为“小写”的自定义分析器,它使用“关键字”标记器和“小写”过滤器。然后,我在映射中添加了一个名为“use_lowercase”的字段,用于我想要使用的字段。我还想保留现有的“文本”和“关键字”字段组件,因为我可能想在字段中搜索术语。 以下是索引定义,包括自定义分析器: 现在,我添加了两条记录

  • 问题内容: 如何编写一个将整个字段值而不是单个标记考虑在内的ElasticSearch术语聚合查询?比如,我想通过城市名聚集,但下面的回报,,并作为单独的水桶,不和的水桶预期。 问题答案: 您应该在映射中解决此问题。添加一个not_analyzed字段。如果您还需要分析的版本,则可以创建多字段。 现在在city.raw上创建聚合

  • 我试图在elasticsearch中对术语聚合的桶进行排序,不区分大小写。以下是字段映射: 请注意,此处的此数据结构适用于PHP。 聚合如下所示: 这是可行的,但生成的桶是按字典顺序排列的。 我在这里找到了一些有趣的文档,它们解释了如何做到这一点,但这是在对点击进行排序的上下文中,而不是在聚合桶中。 我还是试过了。以下是我创建的分析器: 这里是更新的字段映射,使用分析器有一个名为“sort”的新子