使用Elasticsearch计算文档数量

Dro*_*ror 39 elasticsearch

如果想要计算索引(Elasticsearch)中的文档数量,那么(至少?)有两种可能性:

  • 直接 count

    POST my_index/_count

    应该返回文件的数量my_index.

  • 运用 search

    在这里,人们可以使用countsearch_type或一些其他类型.在任何一种情况下,总计数都可以从字段中提取['hits']['total']

我的问题是:

  • 不同方法之间有什么区别?我应该选择哪一个?

  • 我提出这个问题是因为根据所选择的方法我会遇到不同的结果.我现在正在调试问题,这个问题突然出现了.

Jil*_*urp 38

可能_count有点快,因为它不必执行具有排名和结果获取的完整查询,并且可以简单地返回大小.

知道如何设法获得不同的结果会更有趣.为此,我需要更多信息,例如您要发送的确切查询以及索引上是否正在进行索引.

但是假设您执行以下操作

  1. 索引一些文件
  2. 刷新索引

_search_count(匹配所有查询)应返回相同的总数.如果没有,那就太奇怪了.


the*_*man 21

如果_search必须使用,而不是_count和你在Elasticsearch 7.0+,设置size: 0track_total_hits: true将提供相同的信息作为_count

GET my-index/_search
{
  "query": { "term": { "field": { "value": "xyz" } } },
  "size": 0,
  "track_total_hits": true
}


{
  "took" : 612,
  "timed_out" : false,
  "_shards" : {
    "total" : 629,
    "successful" : 629,
    "skipped" : 524,
    "failed" : 0
  },
  "hits" : {
    "total" : {
      "value" : 29349466,
      "relation" : "eq"
    },
    "max_score" : null,
    "hits" : [ ]
  }
}
Run Code Online (Sandbox Code Playgroud)

查看Elasticsearch 7.0 重大变化


Arc*_*ano 16

curl http://localhost:9200/_cat/indices?v 以表格格式为您提供计数和其他信息

health status index                              uuid                   pri rep docs.count docs.deleted store.size pri.store.size
yellow open   logstash-2019.10.09-000001         IS7HBUgRRzO7Rn1puBFUIQ   1   1          0            0       283b           283b
green  open   .kibana_task_manager_1             e4zZcF9wSQGFHB_lzTszrg   1   0          2            0     12.5kb         12.5kb
yellow open   metricbeat-7.4.0-2019.10.09-000001 h_CWzZHcRsakxgyC36-HTg   1   1       6118            0      2.2mb          2.2mb
green  open   .apm-agent-configuration           J6wkUr2CQAC5kF8-eX30jw   1   0          0            0       283b           283b
green  open   .kibana_2                          W2ZETPygS8a83-Xcd6t44Q   1   0       1836           23      1.1mb          1.1mb
green  open   .kibana_1                          IrBlKqO0Swa6_HnVRYEwkQ   1   0          8            0    208.8kb        208.8kb
yellow open   filebeat-7.4.0-2019.10.09-000001   xSd2JdwVR1C9Ahz2SQV9NA   1   1          0            0       283b           283b
green  open   .tasks                             0ZzzrOq0RguMhyIbYH_JKw   1   0          1            0      6.3kb          6.3kb
Run Code Online (Sandbox Code Playgroud)

  • 另请注意,可以提供“format=json”或“format=yaml”作为查询参数,以机器可读格式返回 CAT 端点结果。此外,返回的列可以使用 h=index,docs.count 进行过滤,因此检索许多索引的文档计数的简洁方法可能是:curl http://localhost:9200/_cat/indices?h=index ,docs.count&format=json` (3认同)

Ade*_*qui 12

老问题,因为在 ElasticSearch 版本 > 7.0 上插话:

  1. _search: 返回具有搜索查询命中计数的文档,小于或等于结果窗口大小,通常为 10,000。例如:

    {"took":3,"timed_out":false,"_shards":{"total":1,"successful":1,"skiped":0,"failed":0},"hits":{"total ":{"value":10000,"relation":"gte"},"max_score": 0.34027478,"hits":[...]}}

  2. _count:无论结果窗口大小如何,都返回搜索查询的总命中数。没有返回文件,例如:

    {"count":5703899,"_shards":{"total":1,"successful":1,"skip":0,"failed":0}}

因此,_search如果这是您配置的结果窗口大小,则可能会将总命中数返回为 10,000,而_count将返回同一查询的实际计数。

  • 谢谢。这应该是公认的答案,因为 _search 永远不会返回超过 10,000 的计数。 (2认同)