Я надеюсь на некоторые разъяснения относительно производительности запросов в эластичной версии 1.5.2, которую я недавно наблюдал.
У меня есть строковое поле с высокой кардинальностью (около 200 000 000). Я заметил, что если я использую простую агрегацию терминов с подсказкой выполнения global_ordinals_low_cardinality, происходят две вещи: 1. Запрос возвращает те же результаты, что и с global_ordinals или global_ordinals_hash. 2. Запрос выполняется значительно быстрее. (примерно в два раза быстрее, чем global_ordinals, и в 4 раза быстрее, чем global_ordinals_hash.
Вот запрос:
{
"aggs": {
"myTerms": {
"terms": {
"field": "myField",
"size": 1000,
"shard_size": 1000,
"execution_hint": "global_ordinals_low_cardinality"
}
}
}
}
Я не понимаю, почему вообще допустимо использовать global_ordinals_low_cardinality в этом случае, потому что мое поле имеет высокую кардинальность. Так что, возможно, я не понимаю, что именно означает global_ordinals_low_cardinality?
Во-вторых, у меня есть еще одно числовое поле (длинное) примерно с таким же значением кардинальности. Значения длинного поля на самом деле являются предварительно вычисленными хеш-значениями (murmur3) для того же строкового поля, что и выше, что я использую для значительного ускорения агрегирования количества элементов. Выполнение агрегации тех же терминов в числовом поле работает так же плохо, как global_ordinals_hash. Фактически, не имеет значения, какую подсказку выполнения я использую, время выполнения остается прежним.
Так почему же global_ordinals_low_cardinality применим для строковых типов, но не для длинных? Это потому, что числовые поля вообще не требуют глобальных порядковых номеров?
Спасибо