У меня есть базовое агрегирование индекса с примерно 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
.
Что я пробовал до сих пор:
- Выделение большего объема оперативной памяти (от 4 ГБ до 32 ГБ) дает те же результаты.
- Изменив тип данных поля
countryId
наkeyword
и добавив параметрeager_global_ordinals
, стало только хуже
Версия elasticsearch - 7.8.0
, elastic имеет 8 ГБ оперативной памяти, сервер имеет 64 ГБ оперативной памяти и 16 ЦП, 5 осколков, 1 узел
Я использую это агрегирование для добавления фильтров в результаты поиска, поэтому мне нужно, чтобы он отвечал как можно быстрее. Для большого количества результатов мне не нужна точность. так что, если это приблизительное или даже ограниченное число (например, 100 gte), это здорово.
Есть идеи, как ускорить эту агрегацию?