【问题标题】:elasticsearch aggregation - exact count for bucket弹性搜索聚合 - 桶的确切计数
【发布时间】:2017-01-26 14:29:26
【问题描述】:

Elasticsearch 新手问题。我将shakespeare.json 加载到Elastic 中,并试图弄清楚如何进行类似于select speaker, count(1) from line group by speaker 的聚合。 (“Line”是文档的类型,“speaker”是属性之一。)

现在我有一个这样的查询:

{
  "size": 0,
  "query": {
    "query": {
      "match": {
        "play_name": "HAMLET"
      }
    }
  },
  "aggs": {
    "line_count": {
      "terms": {
        "field": "speaker.speaker_raw"
      }
    }
  }
}

结果看起来正确,但 ElasticSearch 文档指定术语聚合的文档计数是近似值 (https://www.elastic.co/guide/en/elasticsearch/reference/current/search-aggregations-bucket-terms-aggregation.html)。还有其他一些魔法可以在桶中获得准确的计数吗?

另外,我已经发现我必须在索引上预先定义一个字段,以获得未经分析的“说话者”版本,以确保我可以聚合原始字段值,而不是标记化。 (见Elasticsearch - Cardinality over Full Field Value)

【问题讨论】:

  • 对于 terms 聚合,ES 中的计数是准确和完整的,基数和百分位数聚合的唯一近似值是 (IIRC)。见:elastic.co/guide/en/elasticsearch/reference/current/… 和:elastic.co/guide/en/elasticsearch/reference/current/…
  • 术语聚合的文档也说计数也是近似的。想知道这是否由 size: 0 处理?
  • 哈,从来没有注意到这一点。如果我没看错,大概计数的原因是由于分片存储对“前 x”结果存在“偏见”。所以我想如果你使用size:0 它应该是准确的,你怎么看?
  • 我认为你是对的。如果你这样回答我可以接受。

标签: elasticsearch


【解决方案1】:

现在已弃用设置 size:0,因为具有高基数字段值的集群会出现内存问题。您只能使用 1 到 2147483647 之间的数字。

来源:https://github.com/elastic/elasticsearch/issues/18838

【讨论】:

    【解决方案2】:

    根据documentation,术语聚合中的近似计数的原因是由于分片分桶对“前 x”结果存在“偏见”。

    如果您设置"size": 0,我很确定 Elasticsearch 将返回准确的结果。

    【讨论】:

    • 可能在最近的版本中有所改变,但 0 会导致错误[size] must be greater than 0
    猜你喜欢
    • 2017-09-25
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2019-02-22
    • 2015-12-30
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多