Elasticsearch определяет производительность агрегирования

У меня есть базовое агрегирование индекса с примерно 40 миллионами документов.

{
    aggs: {
        countries: {
            filter: {
                bool: {
                    must: my_filters,
                }
            },
            aggs: {
                filteredCountries: {
                    terms: {
                        field: 'countryId',
                        min_doc_count: 1,
                        size: 15,
                    }
                }
            }
        }
    }
}

Индекс:

{
    "settings": {
        "number_of_shards": 5, 
        "analysis": {
            "filter": {
                "autocomplete_filter": {
                    "type": "edge_ngram",
                    "min_gram": 1,
                    "max_gram": 20
                }
            },
            "analyzer": {
                "autocomplete": {
                    "type": "custom",
                    "tokenizer": "standard",
                    "filter": [
                        "lowercase",
                        "autocomplete_filter",
                        "unique"
                    ]
                }
            }
        },
    },
    "mappings": {
        "properties": {
            "id": {
                "type": "integer"
            },
            "name": {
                "type": "text",
                "analyzer": "autocomplete",
                "search_analyzer": "standard"
            },
            "countryId": {
                "type": "short"
            }
        }
    }
}

Время отклика при поиске составляет 100 мс, но время отклика агрегирования составляет около 1,5 с и увеличивается по мере добавления новых документов (было около 200 мс с 5 миллионами документов). Прямо сейчас существует около 20 различных countryId.

Что я пробовал до сих пор:

  1. Выделение большего объема оперативной памяти (от 4 ГБ до 32 ГБ) дает те же результаты.
  2. Изменив тип данных поля countryId на keyword и добавив параметр eager_global_ordinals, стало только хуже

Версия elasticsearch - 7.8.0, elastic имеет 8 ГБ оперативной памяти, сервер имеет 64 ГБ оперативной памяти и 16 ЦП, 5 осколков, 1 узел

Я использую это агрегирование для добавления фильтров в результаты поиска, поэтому мне нужно, чтобы он отвечал как можно быстрее. Для большого количества результатов мне не нужна точность. так что, если это приблизительное или даже ограниченное число (например, 100 gte), это здорово.

Есть идеи, как ускорить эту агрегацию?


person Valera    schedule 27.06.2020    source источник


Ответы (1)


Причина медлительности:

  1. Причина - взрыв ведра. И режим сбора в ширину еще больше ускорится.

Согласно doc, вы можете продолжить оптимизацию с помощью режима сбора сначала в ширину.

Несмотря на то, что количество участников может быть сравнительно небольшим и нам нужно только 50 блоков результатов, во время вычислений происходит комбинаторный взрыв блоков - один субъект может создать n² блоков, где n - количество участников. Найти 10 популярных актеров и 5 лучших соавторов.

  1. Я предлагаю вам установить Подсказка выполнения. Поскольку у вас очень мало уникальных значений, я предлагаю вам установить подсказку как карту.

  2. Еще одна оптимизация, скажем, некоторые документы не были доступны в последние несколько недель, вы можете использовать поле из своего фильтра, чтобы разделить агрегирование по определенному набору документов.

  3. Еще одна оптимизация, которую вы можете исключить, укажите, какие страны нужны, если это возможно в вашем сценарии использования. Фильтр

person Gibbs    schedule 27.06.2020
comment
Спасибо за предложения. Сначала ширина ничего не изменила, у нас всего около 20 уникальных терминов, поэтому разбиение на разделы тоже не очень поможет, что касается фильтрации, мы не можем удалить страны из поиска. - person Valera; 28.06.2020
comment
Вы пытались установить подсказку о выполнении как карту? Можете ли вы добавить свои фильтры? - person Gibbs; 28.06.2020
comment
execute_hind не помогло, фильтры - это только поле match на name, но фильтр определенно не проблема, потому что без них (пустая агрегация без фильтров) медленнее, чем агрегация с фильтрами - person Valera; 28.06.2020
comment
Что ставили на казнь? Порядковый номер или карта? - person Gibbs; 28.06.2020
comment
Было лучше или хуже? Я имею в виду затраченное время. Мы могли сравнивать. Сколько у вас узлов и шардов? - person Gibbs; 28.06.2020
comment
map в среднем примерно на 200 мс медленнее, чем порядковый. 5 осколков, 1 узел - person Valera; 28.06.2020