Ответ 1
Я не думаю, что есть какие-либо ограничения, установленные Elaticsearch или Lucene явно. Однако предел, который вы могли бы нанести, - это тот, который установлен JDK на месте.
Чтобы доказать мое утверждение выше, я посмотрел исходный код Elasticsearch:
-
когда запрос приходит в существует синтаксический анализатор, который анализирует массив идентификаторов. Все, что он использует, - это
ArrayList
. Затем он передается вместе с Lucene, который, в свою очередь, использует список. -
это класс Lucene TermsFilter (строка 84), который получает список IDS из Elasticsearch в списке.
-
исходный код класса
ArrayList
от Oracle JDK 1.7.0_67:
/**
* The maximum size of array to allocate.
* Some VMs reserve some header words in an array.
* Attempts to allocate larger arrays may result in
* OutOfMemoryError: Requested array size exceeds VM limit
*/
private static final int MAX_ARRAY_SIZE = Integer.MAX_VALUE - 8;
/**
* Increases the capacity to ensure that it can hold at least the
* number of elements specified by the minimum capacity argument.
*
* @param minCapacity the desired minimum capacity
*/
private void grow(int minCapacity) {
...
if (newCapacity - MAX_ARRAY_SIZE > 0)
newCapacity = hugeCapacity(minCapacity);
...
}
private static int hugeCapacity(int minCapacity) {
if (minCapacity < 0) // overflow
throw new OutOfMemoryError();
return (minCapacity > MAX_ARRAY_SIZE) ?
Integer.MAX_VALUE :
MAX_ARRAY_SIZE;
}
И это число (Integer.MAX_VALUE - 8
) равно 2147483639
. Таким образом, это будет теоретический максимальный размер этого массива.
Я тестировал локально в своем экземпляре ES массив из 150000 элементов. И здесь последствия производительности: конечно, вы получите снижение производительности, чем больше массив получает. В моем простом тестировании с идентификаторами 150 КБ я получил время выполнения 800 мс. Но все зависит от процессора, памяти, нагрузки, данных, сопоставления данных и т.д. Лучше всего было бы проверить это на самом деле.
ОБНОВЛЕНО декабрь 2016: этот ответ применяется к версии Elasticsearch, существующей в конце 2014 года, то есть в ветки 1.x. Последний доступный в то время был 1.4.x.