J'ai une petite base de données dans Elasticsearch et, à des fins de test, j'aimerais récupérer 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 ceci, s'il vous plaît?
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 aurez peut-être également besoin de &size=BIGNUMBER
pour obtenir plus de 10 éléments. (où BIGNUMBER est égal à un nombre que vous croyez supérieur à votre jeu de données)
MAIS, elasticsearch documentation suggère pour les grands ensembles de résultats, en utilisant le type de recherche par balayage.
PAR EXEMPLE:
curl -XGET 'localhost:9200/foo/_search?search_type=scan&scroll=10m&size=50' -d '
{
"query" : {
"match_all" : {}
}
}'
puis continuez à demander conformément au lien de la documentation suggéré ci-dessus.
EDIT: scan
Obsolète en 2.1.0.
scan
ne fournit aucun avantage par rapport à une demande scroll
régulière triée par _doc
. lien vers les documents élastiques (repéré par @ christophe-roussy)
http://127.0.0.1:9200/foo/_search/?size=1000&pretty=1
^
Notez le paramètre de taille, qui augmente le nombre de hits affichés par défaut (10) à 1000 par fragment.
http://www.elasticsearch.org/guide/fr/elasticsearch/reference/current/search-request-from-size.html
elasticsearch (ES) prend en charge une requête GET ou POST pour extraire les données de l'index de cluster ES.
Quand on fait un GET:
http://localhost:9200/[your index name]/_search?size=[no of records you want]&q=*:*
Quand on fait un post:
http://localhost:9200/[your_index_name]/_search
{
"size": [your value] //default 10
"from": [your start index] //default 0
"query":
{
"match_all": {}
}
}
Je suggérerais d'utiliser un plug-in 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 à tester vos indices.
La requête ci-dessous renverrait les NO_OF_RESULTS que vous souhaitez récupérer.
curl -XGET 'localhost:9200/foo/_search?size=NO_OF_RESULTS' -d '
{
"query" : {
"match_all" : {}
}
}'
Maintenant, la question est que vous voulez tous les enregistrements doivent être 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
curl -XGET 'localhost:9200/foo/_search' -d '
Cela vous donnerait un résultat qui ressemble à celui ci-dessous
{
hits" : {
"total" : 2357,
"hits" : [
{
..................
Le résultat total vous indique le nombre d'enregistrements disponibles dans votre document. Donc, c’est une bonne façon de connaître la valeur de AUCUN RÉSULTAT
curl -XGET 'localhost:9200/_search' -d '
Rechercher tous les types dans tous les index
curl -XGET 'localhost:9200/foo/_search' -d '
Rechercher tous les types dans l'index foo
curl -XGET 'localhost:9200/foo1,foo2/_search' -d '
Rechercher tous les types dans les index foo1 et foo2
curl -XGET 'localhost:9200/f*/_search
Rechercher tous les types dans les index commençant par f
curl -XGET 'localhost:9200/_all/type1,type2/_search' -d '
Types de recherche utilisateur et Tweet dans tous les index
C’est la meilleure solution que j’ai trouvée en utilisant un client python
# Initialize the scroll
page = es.search(
index = 'yourIndex',
doc_type = 'yourType',
scroll = '2m',
search_type = 'scan',
size = 1000,
body = {
# Your query's body
})
sid = page['_scroll_id']
scroll_size = page['hits']['total']
# Start scrolling
while (scroll_size > 0):
print "Scrolling..."
page = es.scroll(scroll_id = sid, scroll = '2m')
# Update the scroll ID
sid = page['_scroll_id']
# Get the number of results that we returned in the last scroll
scroll_size = len(page['hits']['hits'])
print "scroll size: " + str(scroll_size)
# Do something with the obtained page
https://Gist.github.com/drorata/146ce50807d16fd4a6aa
Utilisation du client Java
import static org.elasticsearch.index.query.QueryBuilders.*;
QueryBuilder qb = termQuery("multi", "test");
SearchResponse scrollResp = client.prepareSearch(test)
.addSort(FieldSortBuilder.DOC_FIELD_NAME, SortOrder.ASC)
.setScroll(new TimeValue(60000))
.setQuery(qb)
.setSize(100).execute().actionGet(); //100 hits per shard will be returned for each scroll
//Scroll until no hits are returned
do {
for (SearchHit hit : scrollResp.getHits().getHits()) {
//Handle the hit...
}
scrollResp = client.prepareSearchScroll(scrollResp.getScrollId()).setScroll(new TimeValue(60000)).execute().actionGet();
} while(scrollResp.getHits().getHits().length != 0); // Zero hits mark the end of the scroll and the while loop.
https://www.elastic.co/guide/fr/elasticsearch/client/Java-api/current/Java-search-scrolling.html
utilisez également server:9200/_stats
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 utiles.
Si vous voulez 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é de la v5.0. Vous n'en avez pas besoin)
Commencez avec une requête 'search', mais en spécifiant un paramètre 'scroll' (ici, j'utilise un délai d'une minute):
curl -XGET 'http://ip1:9200/myindex/_search?scroll=1m' -d '
{
"query": {
"match_all" : {}
}
}
'
Cela inclut votre premier "lot" de hits. Mais nous n'avons pas fini ici. La sortie de la commande curl ci-dessus ressemblerait à ceci:
curl -XGET 'localhost:9200/_search/scroll' -d'
{
"scroll" : "1m",
"scroll_id" : "c2Nhbjs2OzM0NDg1ODpzRlBLc0FXNlNyNm5JWUc1"
}
'
Cependant, faire passer le scroll_id n'est pas conçu pour être fait manuellement. Votre meilleur pari est d'écrire du code pour le faire. par exemple. en Java:
private TransportClient client = null;
private Settings settings = ImmutableSettings.settingsBuilder()
.put(CLUSTER_NAME,"cluster-test").build();
private SearchResponse scrollResp = null;
this.client = new TransportClient(settings);
this.client.addTransportAddress(new InetSocketTransportAddress("ip", port));
QueryBuilder queryBuilder = QueryBuilders.matchAllQuery();
scrollResp = client.prepareSearch(index).setSearchType(SearchType.SCAN)
.setScroll(new TimeValue(60000))
.setQuery(queryBuilder)
.setSize(100).execute().actionGet();
scrollResp = client.prepareSearchScroll(scrollResp.getScrollId())
.setScroll(new TimeValue(timeVal))
.execute()
.actionGet();
Maintenant, LOOP sur la dernière commande utilise SearchResponse pour extraire les données.
Simple! Vous pouvez utiliser les paramètres size
et from
!
http://localhost:9200/[your index name]/_search?size=1000&from=0
vous modifiez ensuite la from
progressivement jusqu'à obtenir toutes les données.
Elasticsearch ralentira significatif si vous ajoutez simplement un grand nombre en taille. L'une des méthodes à utiliser pour obtenir tous les documents consiste à utiliser les identifiants de numérisation et de défilement.
https://www.elastic.co/guide/fr/elasticsearch/reference/current/search-request-scroll.html
http: // localhost: 9200/foo/_search/ ? size = 1000 & pretty = 1
vous devrez spécifier le paramètre de requête de taille car la valeur par défaut est 10
La meilleure façon de régler la taille est d'utiliser size = number devant l'URL.
Curl -XGET "http://localhost:9200/logstash-*/_search?size=50&pretty"
Remarque: la valeur maximale pouvant être définie dans cette taille est 10 000. Pour toute valeur supérieure à 10 000, il est prévu que vous utilisiez la fonction de défilement qui minimiserait les risques d’impact sur les performances.
Vous pouvez utiliser l'API _count
pour obtenir la valeur du paramètre size
:
http://localhost:9200/foo/_count?q=<your query>
Retourne {count:X, ...}
. Extrayez la valeur 'X' puis effectuez la requête proprement dite:
http://localhost:9200/foo/_search?q=<your query>&size=X
size param augmente les hits affichés de la valeur par défaut (10) à 500.
http: // localhost: 9200/[indexName]/_search? pretty = true & size = 500 & q = *: *
Changez le de pas à pas pour obtenir toutes les données.
http: // localhost: 9200/[indexName]/_search? size = 500 & from = 0
La documentation officielle fournit la réponse à cette question! vous pouvez le trouver ici .
{
"query": { "match_all": {} },
"size": 1
}
Vous remplacez simplement la taille (1) par le nombre de résultats que vous souhaitez voir!
De Kibana DevTools sa:
GET my_index_name/_search
{
"query": {
"match_all": {}
}
}
curl -X GET 'localhost:9200/foo/_search?q=*&pretty'
Par défaut, Elasticsearch renvoie 10 enregistrements; la taille doit donc être indiquée explicitement.
Ajouter la taille avec la demande pour obtenir le nombre souhaité d'enregistrements.
http: // {Host}: 9200/{nom_index}/_search? pretty = true & size = (nombre d'enregistrements)
Remarque : La taille maximale de la page ne peut pas dépasser index.max_result_window, dont le paramètre par défaut est 10 000.
Si quelqu'un cherche toujours à récupérer toutes les données d'Elasticsearch, comme moi pour certains cas d'utilisation, voici ce que j'ai fait. De plus, toutes les données, tous les index et tous les types de documents. J'utilise Elasticsearch 6.3
curl -X GET "localhost:9200/_search?pretty=true" -H 'Content-Type: application/json' -d'
{
"query": {
"match_all": {}
}
}
'
curl -XGET '{{IP/localhost}}:9200/{{Index name}}/{{type}}/_search?scroll=10m&pretty' -d '{
"query": {
"filtered": {
"query": {
"match_all": {}
}}'
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)
GET my_index_name/my_type_name/_search
{
"query":{
"match_all":{}
},
size : 20,
from : 3
}
pour obtenir tous les enregistrements, vous devez utiliser la requête "match_all".
taille est le nombre d'enregistrements que vous souhaitez récupérer (type de limite). par défaut, ES ne renverra que 10 enregistrements
from 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".
Pour renvoyer tous les enregistrements de tous les index, vous pouvez effectuer:
curl -XGET http://35.195.120.21:9200/_all/_search?size=50&pretty
Sortie:
"took" : 866,
"timed_out" : false,
"_shards" : {
"total" : 25,
"successful" : 25,
"failed" : 0
},
"hits" : {
"total" : 512034694,
"max_score" : 1.0,
"hits" : [ {
"_index" : "grafana-dash",
"_type" : "dashboard",
"_id" : "test",
"_score" : 1.0,
...
Aucun, à l'exception de @Akira Sendoh, qui a expliqué comment obtenir TOUS les documents. Mais même cette solution bloque mon service ES 6.3 sans les journaux. La seule chose qui a fonctionné pour moi en utilisant la bibliothèque elasticsearch-py
de bas niveau était via helper scan qui utilise scroll()
api:
from elasticsearch.helpers import scan
doc_generator = scan(
es_obj,
query={"query": {"match_all": {}}},
index="my-index",
)
# use the generator to iterate, dont try to make a list or you will get out of RAM
for doc in doc_generator:
# use it somehow
Cependant, la solution la plus propre semble actuellement être la bibliothèque elasticsearch-dsl
, qui offre des appels plus abstraits et plus propres, par exemple: http://elasticsearch-dsl.readthedocs.io/en/latest/search_dsl.html#hits
Une solution simple utilisant le paquet python elasticsearch-dsl :
from elasticsearch_dsl import Search
from elasticsearch_dsl import connections
connections.create_connection(hosts=['localhost'])
s = Search(index="foo")
response = s.scan()
count = 0
for hit in response:
# print(hit.to_dict()) # be careful, it will printout every hit in your index
count += 1
print(count)
Voir aussi https://elasticsearch-dsl.readthedocs.io/en/latest/api.html#elasticsearch_dsl.Search.scan .
Le résultat maximum qui sera renvoyé parasticSearch est 10000 en fournissant la taille
curl -XGET 'localhost:9200/index/type/_search?scroll=1m' -d '
{
"size":10000,
"query" : {
"match_all" : {}
}
}'
Après cela, vous devez utiliser l'API Scroll pour obtenir le résultat, obtenir la valeur _scroll_id et la mettre dans scroll_id.
curl -XGET 'localhost:9200/_search/scroll' -d'
{
"scroll" : "1m",
"scroll_id" : ""
}'