Elasticsearch - 一个查询的每个索引计数

Elasticsearch - count per index for one query

在一个 Elasticsearch 集群中,我有大约 30 个具有相同结构的索引。

我需要找出哪些索引会 return 至少为我的查询提供 1 个结果。

结果本身并不重要。我将根据索引的名称做出业务逻辑决策,该索引至少包含 1 个满足搜索条件的文档。

根据输入,搜索可能 return 从 0 到 ~10 000 000 次命中所有索引。使用不同的输入将执行搜索约 50 000 次。

我看到以下解决方案:

  1. 使用滚动搜索 API 并查看所有结果以找出它们来自哪个索引。 这是目前正在实施的,我正在寻找更快的解决方案。
  2. 使用计数 API 并对每个索引进行计数。这将导致更多的请求。 这会更快吗?
  3. 还有另一个possibility/API吗?

我会在 _index 元数据字段上使用 terms 桶聚合 (https://www.elastic.co/guide/en/elasticsearch/reference/current/search-aggregations-bucket-terms-aggregation.html)。然后,我会知道哪个索引的命中率超过 1。

例如,

{
  "query": { your_query },
  "aggs": {
    "group_by_index": {
      "terms": {
        "field": "_index",
        "size": "30"
      }
    }
  }
}

我会使用@glenacota 提到的聚合函数。此外,您可以 运行 在多个索引上或针对 alias 指向所有 30 个索引,例如

GET my_index_1, another_index_*/_search?size=0

不过,考虑到您正在查看大量索引、它们的文档计数和请求数,我还建议分析查询并查看它对您的集群的影响。