J'ai une petite base de données dans Elasticsearch et à des fins de test, je voudrais retirer tous les enregistrements. J'essaie d'utiliser une URL du formulaire ...
http://localhost:9200/foo/_search?pretty=true&q={'matchAll':{''}}
Quelqu'un peut-il me donner l'URL que vous utiliseriez pour accomplir cela, s'il vous plaît?
database
elasticsearch
query-string
elasticsearch-dsl
John Livermore
la source
la source
Réponses:
Je pense que la syntaxe lucene est supportée donc:
http://localhost:9200/foo/_search?pretty=true&q=*:*
la taille par défaut est 10, vous devrez donc peut-être également
&size=BIGNUMBER
obtenir plus de 10 articles. (où BIGNUMBER est égal à un nombre que vous pensez être plus grand que votre ensemble de données)MAIS, la documentation elasticsearch suggère des jeux de résultats volumineux, en utilisant le type de recherche de scan.
PAR EXEMPLE:
puis continuez à demander selon le lien de documentation ci-dessus suggère.
EDIT:
scan
obsolète en 2.1.0.scan
n'offre aucun avantage par rapport à unescroll
demande régulière triée par_doc
. lien vers les documents élastiques (repéré par @ christophe-roussy)la source
Notez le paramètre de taille , qui augmente les hits affichés par défaut (10) à 1000 par fragment.
http://www.elasticsearch.org/guide/en/elasticsearch/reference/current/search-request-from-size.html
la source
max_result_window
elasticsearch (ES) prend en charge à la fois une requête GET ou POST pour obtenir les données de l'index de cluster ES.
Quand nous faisons un GET:
Quand nous faisons un POST:
Je suggérerais d'utiliser un plugin d'interface utilisateur avec elasticsearch http://mobz.github.io/elasticsearch-head/ Cela vous aidera à avoir une meilleure idée des indices que vous créez et également à tester vos indices.
la source
from
+size
ne peut pas être supérieur auindex.max_result_window
paramètre d'index qui est par défaut 10 000curl -XGET ... -d '{...}'
qui est unun
style de demande mixte officiel. Merci d'avoir montré les bons formats GET et POST.La requête ci-dessous retournerait les NO_OF_RESULTS que vous aimeriez être renvoyés.
Maintenant, la question ici est que vous voulez que tous les enregistrements soient retournés. Donc, naturellement, avant d'écrire une requête, vous ne connaîtrez pas la valeur de NO_OF_RESULTS .
Comment savons-nous combien d'enregistrements existent dans votre document? Tapez simplement la requête ci-dessous
Cela vous donnerait un résultat qui ressemble à celui ci-dessous
Le résultat total vous indique le nombre d'enregistrements disponibles dans votre document. C'est donc une bonne façon de connaître la valeur de NO_OF RESULTS
Rechercher tous les types dans tous les indices
Rechercher tous les types dans l'index foo
Rechercher tous les types dans les indices foo1 et foo2
Rechercher tous les types dans tous les indices commençant par f
Types de recherche utilisateur et tweet dans tous les index
la source
C'est la meilleure solution que j'ai trouvée en utilisant le client python
https://gist.github.com/drorata/146ce50807d16fd4a6aa
Utilisation du client Java
https://www.elastic.co/guide/en/elasticsearch/client/java-api/current/java-search-scrolling.html
la source
elasticsearch_dsl==5.4.0
et ça marche sanssearch_type = 'scan',
.size=10000
, entre les 5e et 7e itérations. avecstatus=127
,main ERROR Null object returned for RollingFile in Appenders
,main ERROR Unable to locate appender "rolling" for logger config "root"
Aucun fichier journal/var/log/elasticsearch/elasticsearch.log
scan
helpers` qui fait défiler sous le capot (depuis la version 5.xx au moins)search_type = 'scan'
est obsolète. Un code similaire fonctionnera sans cela, bien qu'il existe des différences intéressantes qui sont bien enfouies dans l'ancienne documentation. elastic.co/guide/en/elasticsearch/reference/1.4/… En particulier, lors de la migration pour ne pas utiliser search_type = scan, cette première requête de «recherche» viendra avec le premier lot de résultats à traiter.Elasticsearch sera beaucoup plus lent si vous ajoutez simplement un grand nombre comme taille, une méthode à utiliser pour obtenir tous les documents consiste à utiliser les ID de numérisation et de défilement.
https://www.elastic.co/guide/en/elasticsearch/reference/current/search-request-scroll.html
Dans Elasticsearch v7.2, vous le faites comme ceci:
Les résultats de cela contiendraient un _scroll_id que vous devez interroger pour obtenir les 100 prochains morceaux.
la source
search_type=scan
est désormais obsolète. Vous devez donc supprimer cela, mais le comportement a ensuite légèrement changé. Le premier lot de données revient de l'appel de recherche initial. Le lien que vous fournissez montre la bonne façon de le faire.utilisez
server:9200/_stats
également pour obtenir des statistiques sur tous vos alias .. comme la taille et le nombre d'éléments par alias, c'est très utile et fournit des informations utilesla source
Si vous souhaitez extraire plusieurs milliers d'enregistrements, alors ... quelques personnes ont donné la bonne réponse en utilisant "scroll" (Remarque: certaines personnes ont également suggéré d'utiliser "search_type = scan". Ceci était obsolète et supprimé dans la v5.0. Vous n'en avez pas besoin)
Commencez par une requête de recherche, mais en spécifiant un paramètre de défilement (ici, j'utilise un délai de 1 minute):
Cela inclut votre premier «lot» de hits. Mais nous n'avons pas fini ici. La sortie de la commande curl ci-dessus ressemblerait à ceci:
Il est important d'avoir _scroll_id à portée de main car vous devez ensuite exécuter la commande suivante:
Cependant, passer le scroll_id n'est pas quelque chose conçu pour être fait manuellement. Le mieux est d'écrire du code pour le faire. par exemple en java:
Maintenant, LOOP sur la dernière commande utilise SearchResponse pour extraire les données.
la source
Facile! Vous pouvez utiliser
size
etfrom
paramétrer!puis vous modifiez
from
progressivement jusqu'à obtenir toutes les données.la source
from
+size
ne peuvent pas être supérieurs au paramètre d'index index.max_result_window qui est par défaut 10 000from
etsize
vous rencontrerez le problème de pagination profonde. Utilisez l'API scroll pour effectuer un vidage de tous les documents.La meilleure façon d'ajuster la taille est d'utiliser size = number devant l'URL
Remarque: la valeur maximale qui peut être définie dans cette taille est de 10000. Pour toute valeur supérieure à dix mille, elle attend de vous que vous utilisiez la fonction de défilement qui minimise les risques d'impact sur les performances.
la source
Vous pouvez utiliser l'
_count
API pour obtenir la valeur dusize
paramètre:Retours
{count:X, ...}
. Extrayez la valeur 'X' puis effectuez la requête réelle:la source
http: // localhost: 9200 / foo / _search / ? taille = 1000 et jolie = 1
vous devrez spécifier le paramètre de requête de taille car la valeur par défaut est 10
la source
size param augmente les hits affichés de la valeur par défaut (10) à 500.
Modifier la de l' étape par étape pour obtenir toutes les données.
la source
Pour Elasticsearch 6.x
Demande:
GET /foo/_search?pretty=true
Réponse: dans Hits-> total, donnez le nombre de documents
la source
S'il s'agit d'un petit ensemble de données (par exemple, 1 000 enregistrements) , vous pouvez simplement spécifier
size
:La requête match all n'est pas nécessaire, car elle est implicite.
Si vous avez un ensemble de données de taille moyenne, comme des enregistrements 1M , vous n'avez peut-être pas assez de mémoire pour le charger, vous avez donc besoin d'un défilement .
Un défilement est comme un curseur dans une base de données. Dans Elasticsearch, il se souvient de l'endroit où vous vous êtes arrêté et conserve la même vue de l'index (c'est-à-dire empêche le chercheur de s'en aller avec un rafraîchissement , empêche les segments de fusionner ).
Côté API, vous devez ajouter un paramètre de défilement à la première requête:
Vous récupérez la première page et un ID de défilement:
N'oubliez pas que l'ID de défilement que vous récupérez et le délai d'expiration sont valides pour la page suivante . Une erreur courante consiste à spécifier un délai d'attente très important (valeur de
scroll
), qui couvrirait le traitement de l'ensemble de données (par exemple 1 million d'enregistrements) au lieu d'une page (par exemple 100 enregistrements).Pour obtenir la page suivante, remplissez le dernier ID de défilement et un délai d'expiration qui devrait durer jusqu'à la récupération de la page suivante:
Si vous avez beaucoup à exporter (par exemple des documents 1B) , vous voudrez paralléliser. Cela peut être fait via un rouleau en tranches . Supposons que vous souhaitiez exporter sur 10 threads. Le premier thread émettrait une requête comme celle-ci:
Vous récupérez la première page et un ID de défilement, exactement comme une demande de défilement normale. Vous le consommeriez exactement comme un défilement normal, sauf que vous obtenez 1 / 10ème des données.
D'autres threads feraient de même, sauf que ce
id
serait 1, 2, 3 ...la source
la source
Par défaut, Elasticsearch renvoie 10 enregistrements, la taille doit donc être indiquée explicitement.
Ajoutez la taille avec la demande pour obtenir le nombre d'enregistrements souhaité.
http: // {hôte}: 9200 / {index_name} / _search? pretty = true & size = (nombre d'enregistrements)
Remarque: la taille de page maximale ne peut pas être supérieure au paramètre d'index index.max_result_window, qui est par défaut 10 000.
la source
De Kibana DevTools c'est:
la source
Une solution simple utilisant le package python elasticsearch-dsl :
Voir également https://elasticsearch-dsl.readthedocs.io/en/latest/api.html#elasticsearch_dsl.Search.scan .
la source
Le résultat maximum qui sera renvoyé par ElasticSearch est 10000 en fournissant la taille
Après cela, vous devez utiliser l'API Scroll pour obtenir le résultat et obtenir la valeur _scroll_id et mettre cette valeur dans scroll_id
la source
La documentation officielle apporte la réponse à cette question! vous pouvez le trouver ici .
Vous remplacez simplement la taille (1) par le nombre de résultats que vous souhaitez voir!
la source
Pour renvoyer tous les enregistrements de tous les index, vous pouvez:
curl -XGET http://35.195.120.21:9200/_all/_search?size=50&pretty
Production:
la source
la source
Aucun, sauf @Akira Sendoh a répondu comment obtenir TOUS les documents. Mais même cette solution plante mon service ES 6.3 sans journaux. La seule chose qui a fonctionné pour moi en utilisant la
elasticsearch-py
bibliothèque de bas niveau était grâce à l'aide à l'analyse qui utilise l'scroll()
api:Cependant, la manière la plus propre de nos jours semble être la
elasticsearch-dsl
bibliothèque, qui propose des appels plus abstraits et plus propres, par exemple: http://elasticsearch-dsl.readthedocs.io/en/latest/search_dsl.html#hitsla source
Si quelqu'un cherche encore toutes les données à récupérer dans Elasticsearch comme moi pour quelques cas d'utilisation, voici ce que j'ai fait. De plus, toutes les données signifient, tous les index et tous les types de documents. J'utilise Elasticsearch 6.3
Référence Elasticsearch
la source
c'est la requête pour accomplir ce que vous voulez, (je suggère d'utiliser Kibana, car cela aide à mieux comprendre les requêtes)
pour obtenir tous les enregistrements, vous devez utiliser la requête "match_all".
taille correspond au nombre d'enregistrements que vous souhaitez récupérer (type de limite). par défaut, ES ne renverra que 10 enregistrements
est comme sauter, sauter les 3 premiers enregistrements.
Si vous voulez récupérer exactement tous les enregistrements, utilisez simplement la valeur du champ "total" du résultat une fois que vous avez frappé cette requête de Kibana et utilisez-la avec "taille".
la source
Utilisation d'Elasticsearch 7.5.1
dans le cas où vous pouvez également spécifier la taille de votre tableau avec & size = $ {number}
au cas où vous ne savez pas que vous indexez
la source
L'utilisation de la console kibana et de my_index comme index pour rechercher les éléments suivants peut être apportée. En demandant à l'index de ne renvoyer que 4 champs de l'index, vous pouvez également ajouter une taille pour indiquer le nombre de documents que vous souhaitez renvoyer par l'index. À partir d'ES 7.6, vous devriez utiliser _source plutôt que filtrer, il répondra plus rapidement.
la source
Vous pouvez utiliser size = 0 cela vous renverra tous les documents exemple
la source