Elasticsearch - количество на индекс для одного запроса - PullRequest
1 голос
/ 11 апреля 2020

В кластере Elasticsearch у меня около 30 индексов с одинаковой структурой.

Мне нужно выяснить, какой из индексов вернет хотя бы 1 результат для моего запроса.

Сам результат не имеет значения. Я буду принимать решения по бизнес-логике c на основе имени индекса, который содержит как минимум 1 документ, удовлетворяющий критериям поиска.

Поиск может возвращать от 0 до ~ 10 000 000 совпадений по всем индексам в зависимости от ввода. Поиск будет выполнен ~ 50 000 раз с другим вводом.

Я вижу следующие решения:

  1. Используйте API поиска с прокруткой и просматривайте все результаты, чтобы узнать из какой индекс они есть. Это то, что в настоящее время реализовано, и я ищу более быстрое решение.
  2. Используйте API подсчета и подсчитайте для каждого индекса. Это приведет к большему количеству запросов. Может ли это быть быстрее?
  3. Существует ли другая возможность / API?

Ответы [ 2 ]

2 голосов
/ 11 апреля 2020

Я бы использовал terms агрегацию сегмента (https://www.elastic.co/guide/en/elasticsearch/reference/current/search-aggregations-bucket-terms-aggregation.html) над полем метаданных _index. Тогда я бы знал, какой индекс имеет более одного попадания.

Например,

{
  "query": { your_query },
  "aggs": {
    "group_by_index": {
      "terms": {
        "field": "_index",
        "size": "30"
      }
    }
  }
}
0 голосов
/ 12 апреля 2020

Я бы использовал такие агги, как упомянутое @glenacota. Кроме того, вы можете выполнить это по нескольким индексам или по alias, указывающему на все ваши 30 индексов, например

GET my_index_1, another_index_*/_search?size=0

Хотя я также порекомендую профилировать запрос и посмотреть, как он будет действовать против вашего кластер, учитывая, что вы просматриваете большое количество индексов, их количество документов и количество запросов.

...