【问题标题】:Elasticsearch index stats differ from search hitsElasticsearch 索引统计信息与搜索命中不同
【发布时间】:2018-05-01 11:22:07
【问题描述】:

当使用 curl 'http://localhost:9200/_cat/indices?v' 文档数检查 Elasticsearch 实例中的索引状态时,每个 index 中的 docs.count 通常大于搜索该索引上的所有文档时返回的搜索结果数。

有时它是搜索命中的整数倍,但并非总是如此。在一种情况下,索引中有match_all98160 命中但805383 文档。

请注意,映射中没有嵌套文档。

解释是什么?请注意,搜索似乎运行正常。

【问题讨论】:

  • 你能提供_cat/indices给你的输出吗?

标签: elasticsearch


【解决方案1】:

这可能是因为您的数据被分片到多个节点(多节点集群设置)而没有replicas,并且可能在您执行搜索查询时其中一个节点已关闭。

例如, 如果我有一个只有一个节点的集群,并且该节点有 1 个index4 documents,当我检查indices 时,我将得到以下输出,

health status index pri rep docs.count docs.deleted store.size pri.store.size 
yellow open   blog    5   1          4            0     10.9kb         10.9kb 

现在,如果我运行 match_all 查询,

{
    "query": {
        "match_all": {}
    }
}

我会得到的,

{
    "took": 3,
    "timed_out": false,
    "_shards": {
        "total": 5,
        "successful": 5,
        "failed": 0
    },
    "hits": {
        "total": 4,
        "max_score": 1,
        "hits": [........

注意docs.count 等于hits 计数。在上面的输出中,观察分片的数量,它们是5。所有这些分片都分配给一个节点。

但如果我有一个多节点设置并配置了replicas not,那么这些分片将分布在多个节点中。

假设我有一个具有 Node 1Node 2 的两个节点集群,总共有 5 个分片,在这 5 个分片中 shard 0, 1 , 3 被分配给 节点 2 并且该节点因维护而停机或因任何原因不可用。在这种情况下,您只有通过 节点 1 可用的分片 24。现在,如果您尝试检索或搜索数据,会发生什么? Elasticsearch 将为您提供来自幸存节点的搜索结果,即 Node 1

这种情况下的命中数将始终小于docs.count 值。

使用replicas

可以避免这种不确定性

【讨论】:

    【解决方案2】:

    matches all documents, giving them all a _score of 1.0.

    需要注意的是,如果分析电子邮件字段(这是 Elasticsearch 中字段的默认设置),此查询将无法按预期工作。在这种情况下,电子邮件字段将分为三个部分:joe、blogs 和 com。这意味着它将匹配其中任何三个术语的搜索和文档。 link

    how scoring works

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2023-03-26
      • 1970-01-01
      • 1970-01-01
      • 2014-02-26
      • 1970-01-01
      • 2015-09-22
      • 1970-01-01
      • 2023-03-31
      相关资源
      最近更新 更多