#elasticsearch #query-optimization #real-time #bigdata
#elasticsearch #оптимизация запросов #в режиме реального времени #bigdata
Вопрос:
У нас есть огромный индекс — с миллиардами документов — в нашем кластере из 5 узлов, который выполняет различные запросы в сопоставлении родитель-потомок.
Когда мы используем предложение sort
, большинство этих запросов обычно теряют время ожидания или навсегда зависают в этом конкретном огромном индексе.
Я думал использовать какой-то кеш, который хранит первый результат, затем сортирует его или даже использует какой-нибудь «инструмент масштабируемых заданий», такой как Apache Spark, но добавит дополнительную сложность в нашу инфраструктуру.
У кого-нибудь есть такой вариант использования, который может помочь с некоторыми идеями?
Редактировать:
По сути, у нас есть 2 типа, user
и event
именно поэтому мы моделируем как родительский / дочерний — events
имеем огромную пропускную способность. Обычно мы сортируем по некоторому custom_data
или другому полю вложенного документа, например revenue
.
Это отображение этих 2 типов:
https://gist.github.com/allansene/5e1e1743b5cbdbd337a19b066fbe8e9b
Ниже приведен пример запроса. Без какого-либо предложения сортировки потребовалось 51 сек:
{
"query": {
"filtered": {
"filter": {
"and": {
"filters": [{
"has_child": {
"type": "event",
"filter": {
"term": {
"action": "acessou-pagamento"
}
}
}
}, {
"not": {
"filter": {
"has_child": {
"type": "action",
"filter": {
"and": {
"filters": [{
"term": {
"action": "comprou-ingresso"
}
}, {
"range": {
"updated_at.date": {
"gte": "2016-10-23||/d"
}
}
}]
}
}
}
}
}
}]
}
}
}
}
}
Комментарии:
1. Какое предложение sort вы используете? Можете ли вы привести несколько примеров?
2. @Val я только что добавил еще немного информации выше…