Max de limite sur le nombre de valeurs que je peux spécifier dans les identifiants de filtre ou de façon générale, la requête de la clause?
Dans elasticsearch quelle est la limite max. pour spécifier la valeur du nombre de valeurs d'un match peut être effectuée? J'ai lu quelque part qu'il est de 1024 mais est également configurable. Est-ce vrai? Et comment elle affecte la performance?
curl -XPOST 'localhost:9200/my_index/_search?pretty' -d '{
"query": {
"filtered": {
"filter": {
"not": {
"ids": {
"type": "my_type",
"values": ["1", "2", "3"]
}}}}}}'
Combien de valeurs puis-je indiquer dans ce tableau ? Quelle est la limite? Si c'est configurable quel est l'impact de la performance sur l'augmentation de la limite?
Vous devez vous connecter pour publier un commentaire.
Je ne pense pas qu'il existe une limite fixée par Elaticsearch ou Lucene explicitement. La limite vous pourriez frapper, cependant, est celui mis en place par le JDK.
Pour prouver ma déclaration ci-dessus, j'ai regardé le code source de Elasticsearch:
lorsque la demande vient il est un analyseur qui analyse le tableau des id. Tous qu'il utilise est un
ArrayList
. Il est ensuite passé le long de Lucene, qui à son tour, c'est à l'aide d'une Liste.c'est la Lucene TermsFilter classe (ligne n ° 84) qui obtient la liste des IDENTIFIANTS de Elasticsearch au sein d'une Liste.
code source de
ArrayList
classe à partir d'Oracle JDK 1.7.0_67:Et que le nombre (
Integer.MAX_VALUE - 8
) est2147483639
. Donc, ce serait le théorique max de la taille de ce tableau.Je l'ai testé en local dans mon ES exemple d'un tableau de 150000 éléments. Et voici les conséquences de performance: bien sûr, vous obtenez une dégradation des performances plus le tableau est. Dans mon test simple avec 150k id j'ai eu un 800 ms de temps d'exécution. Mais, tout dépend de la CPU, de la mémoire, de charge, de données. datasize, le mappage de données, etc etc. Le mieux serait pour vous de tester réellement ce.
Mise à JOUR Déc. 2016: cette réponse s'applique pour la Elasticsearch version en vigueur à la fin de l'année 2014, c'est à dire dans le 1.x de la branche. Les plus récentes disponibles à cette époque était de 1,4.x.
maxClauseCount
(qui est liée à des déclarations booléennes dans unbool
/filtre de requête).ids
n'est pas ré-écrit comme un tas debool
consolidés. Très probablement, votre problème vient de d'autres parties de votre requête, qui ne sont pas liés àids
. Votre downvote et commentaire ne pas s'appliquer pour ce poste.Oui! Le nombre de valeurs dans les champs est configurable. Par défaut, il est limité à 1024. Vous pouvez le configurer dans le elasticsearch.fichier yml.
indices.query.bool.max_clause_count: 10000
Remarque: l'Augmentation de la limite de conduire à des taux élevés de la mémoire et du PROCESSEUR.
Consulter ces liens pour plus d'info:
https://groups.google.com/forum/#!topic/elasticsearch/LqywKHKWbeI
https://github.com/elasticsearch/elasticsearch/issues/482
http://elasticsearch-users.115913.n3.nabble.com/index-query-bool-max-clause-count-Setting-and-TermsQueryParser-td3050751.html
http://elasticsearch-users.115913.n3.nabble.com/Query-string-length-limit-td4054066.html
Un niveau de l'indice de limitation sur le nombre de termes dans des termes de la requête sera introduit dans ES 7.0.
Le paramètre index.max_terms_count avec une valeur par défaut de 65536.
De la docs pour la version 6.4: