正在使用Elasticsearch计算文档数

3b6akqbq  于 2022-11-02  发布在  ElasticSearch
关注(0)|答案(6)|浏览(211)

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

*直接count

POST我的索引/计数
应返回my_index中的文档数。

*使用search

在这里,可以使用count作为search_type或其他类型。

我的问题是:

  • 不同的方法有什么不同?2我应该选择哪一种?
  • 我提出这个问题是因为我遇到了不同的结果取决于所选择的方法。我现在正在调试这个问题的过程中,这个问题出现了。
yptwkmov

yptwkmov1#

_count可能更快一点,因为它不必执行带有排名和结果获取的完整查询,并且可以简单地返回大小。
这将是有趣的知道多一点关于你如何管理得到不同的结果虽然。为此,我需要更多的信息,如什么确切的查询,你正在发送,如果任何索引正在进行的索引。
但假设您执行以下操作
1.为某些文档编制索引
1.刷新索引
_search_count(使用match all查询)应该返回相同的总数。如果不是,那就很奇怪了。

nkoocmlb

nkoocmlb2#

如果必须使用_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" : [ ]
  }
}

请参阅Elasticsearch 7.0突破性更改

zysjyyx4

zysjyyx43#

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
mkh04yzy

mkh04yzy4#

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

  1. _search:返回搜索查询命中计数小于或等于结果窗口大小(通常为10,000)的文档。例如:
    {“成功”:3,“超时”:假,"碎片”:{“总数”:1,“成功”:1,“跳过”:0,“失败”:0},“命中数”:{“总数”:{“值”:10000,“关系”:“gte”},“最大得分”:0.34027478,【点击次数】:[...]}}
  2. _count:返回搜索查询的命中总数,而不考虑结果窗口的大小。未返回文档,例如:
    {“计数”:5703899,"碎片”:{“总数”:1,“成功”:1,“跳过”:0,“失败”:0}}
    因此,_search可能会返回总命中数10,000(如果这是您配置的结果窗口大小),而_count将返回同一查询的实际计数。
klsxnrf1

klsxnrf15#

这两个查询提供相同的结果,但:- count消耗较少的资源/带宽,因为不需要提取文档、评分和其他内部优化。将搜索大小设置为0,可能非常相似。
如果你想统计一个索引中的所有记录,你也可以对“_type”字段执行一个聚合条件。
结果应该相同。在比较结果之前,请确保执行索引刷新。

zlwx9yxi

zlwx9yxi6#

如果要逐个检查索引,可以使用以下查询

GET _all/_search
{
  "size": 0, 
  "aggs": {
    "NAME": {
      "terms": {
        "field": "_index",
        "size": 100000
      }
    }
  }
}

结果将是下面的屏幕截图。

相关问题