2012-01-12 13 views
323

Ho un piccolo database in Elasticsearch e per scopi di test vorrei recuperare tutti i record. Sto tentando di utilizzare un URL della forma ...Query Elasticsearch per restituire tutti i record

http://localhost:9200/foo/_search?pretty=true&q={'matchAll':{''}} 

qualcuno può darmi l'URL si può usare per raggiungere questo obiettivo, per favore?

risposta

494

Penso sintassi Lucene è supportata in modo:

http://localhost:9200/foo/_search?pretty=true&q=*:*

Default formato a 10, quindi potrebbe anche essere necessario &size=BIGNUMBER per ottenere più di 10 articoli. (dove BIGNUMBER è uguale a un numero che si ritiene più grande del set di dati)

MA, documentazione di elasticsearch suggests per set di risultati di grandi dimensioni, utilizzando il tipo di ricerca di scansione.

EG:

curl -XGET 'localhost:9200/foo/_search?search_type=scan&scroll=10m&size=50' -d ' 
{ 
    "query" : { 
     "match_all" : {} 
    } 
}' 

e poi tenere chiedendo come per il link di documentazione suggerisce sopra.

MODIFICA: scan Obsoleto in 2.1.0.

scan non fornisce alcun vantaggio rispetto a una richiesta regolare scroll ordinata per _doc. link to elastic docs (notato da @ Christophe-Roussy)

+4

Grazie. Questo è stato il finale che ho trovato e restituisce quello di cui ho bisogno per ora ... http: // localhost: 9200/foo/_search? Size = 50 & pretty = true & q = *: * –

+1

In aggiunta alla risposta di @ Steve, puoi trovare un elenco di parametri che elasticsearch comprende in questo collegamento http://www.elasticsearch.org/guide/reference/api/search/uri-request/ –

+0

È possibile eseguire una ricerca di scansione con una query diversa da una query match_all? – Churro

14

L'interrogazione di seguito restituisce alla NO_OF_RESULTS volete essere restituito ..

curl -XGET 'localhost:9200/foo/_search?size=NO_OF_RESULTS' -d ' 
{ 
"query" : { 
    "match_all" : {} 
    } 
}' 

Ora, la questione qui è che si vuole tutte i record a essere restituito Quindi, naturalmente, prima di scrivere una query, non si conosce il valore di NO_OF_RESULTS.

Come sappiamo quanti record esistono nel documento? È sufficiente digitare la query di seguito

curl -XGET 'localhost:9200/foo/_search' -d ' 

Questo darebbe un risultato che appare come quella qui sotto

{ 
hits" : { 
    "total" :  2357, 
    "hits" : [ 
    { 
     .................. 

Il risultato totale ti dice quanti record sono disponibili nel documento.Quindi, questo è un bel modo di conoscere il valore di NO_OF risultati

curl -XGET 'localhost:9200/_search' -d ' 

Cerca tutti i tipi di tutti gli indici

curl -XGET 'localhost:9200/foo/_search' -d ' 

Cerca tutti i tipi nell'indice foo

curl -XGET 'localhost:9200/foo1,foo2/_search' -d ' 

Ricerca tutti i tipi negli indici foo1 e foo2

curl -XGET 'localhost:9200/f*/_search 

Cerca tutti i tipi di eventuali indici che iniziano con F

curl -XGET 'localhost:9200/_all/type1,type2/_search' -d ' 

ricerca Tipi utente e Tweet in tutti gli indici

+8

Per impostazione predefinita ES restituirà 10 risultati, a meno che nella query di base non sia incluso un parametro di dimensione. – lfender6445

+0

La precedente risposta aveva tre anni. Aggiornato ad uno attuale. – vjpan8564

96
http://127.0.0.1:9200/foo/_search/?size=1000&pretty=1 
           ^

Nota la dimensione param, che aumenta i colpi visualizzati dal default (10) a 1000 per frammento.

http://www.elasticsearch.org/guide/en/elasticsearch/reference/current/search-request-from-size.html

+1

Tuttavia, una cosa da tenere presente (dai documenti di Elasticsearch): nota che la dimensione + non può essere maggiore dell'impostazione dell'indice index.max_result_window, che per impostazione predefinita è 10.000. – user3078523

10

uso server:9200/_stats anche di ottenere statistiche su tutti gli alias .. come la dimensione e il numero di elementi per alias, che è molto utile e fornisce informazioni utili

+2

Ma, da quello che ricordo, ES consente solo di ottenere 16000 dati per richiesta. Quindi, se i dati sono superiori a 16000, questa soluzione non è sufficiente. –

20

elasticsearch (ES) supporta sia un GET o una richiesta POST per ottenere i dati dall'indice cluster ES.

Quando facciamo un GET:

http://localhost:9200/[your index name]/_search?size=[no of records you want]&q=*:* 

Quando facciamo un POST:

http://localhost:9200/[your_index_name]/_search 
{ 
    "size": [your value] //default 10 
    "from": [your start index] //default 0 
    "query": 
    { 
    "match_all": {} 
    } 
} 

Vorrei suggerire di utilizzare un plugin UI con elasticsearch http://mobz.github.io/elasticsearch-head/ Questo vi aiuterà a ottenere un feeling migliore degli indici che crei e anche i tuoi indici.

4

Elasticsearch otterrà significativo più lento se si aggiunge solo un numero elevato come dimensione, un metodo da utilizzare per ottenere tutti i documenti utilizza gli ID di scorrimento e scorrimento.

Quindi la chiamata potrebbe essere:

GET /foo/_search?search_type=scan&scroll=1m 
{ 
    "query": { "match_all": {}}, 
    "size": 1000 
} 

Ciò restituirà un _scroll_id, che è ora possibile utilizzare per ottenere il primo lotto di documenti.

https://www.elastic.co/guide/en/elasticsearch/guide/current/scan-scroll.html

8

semplice! È possibile utilizzare il parametro size e from!

http://localhost:9200/[your index name]/_search?size=1000&from=0 

quindi si modifica la from a poco a poco fino ad ottenere tutti i dati.

+1

non utilizzare mai questo metodo se i dati contengono molti documenti ... Ogni volta che si passa alla "pagina successiva", l'elastico sarà più lento e lento! Utilizzare SearchAfter invece – Joshlo

2

Alcuni di questi hanno fornito la risposta corretta dell'uso della scansione e dello scorrimento, apparentemente, non ho potuto ottenere una risposta completa che funzionasse magicamente.Quando qualcuno vuole estrarre i record, è necessario eseguire il seguente comando di ricciolo.

curl -XGET 'http://ip1:9200/myindex/_search?scroll=1m' -d ' 
{ 
    "query": { 
      "match_all" : {} 
    } 
} 
' 

Ma non abbiamo finito qui. L'output del comando ricciolo di cui sopra sarebbe qualcosa di simile

{"_scroll_id":"c2Nhbjs1OzUyNjE6NU4tU3BrWi1UWkNIWVNBZW43bXV3Zzs1Mzc3OkhUQ0g3VGllU2FhemJVNlM5d2t0alE7NTI2Mjo1Ti1TcGtaLVRaQ0hZU0FlbjdtdXdnOzUzNzg6SFRDSDdUaWVTYWF6YlU2Uzl3a3RqUTs1MjYzOjVOLVNwa1otVFpDSFlTQWVuN211d2c7MTt0b3RhbF9oaXRzOjIyNjAxMzU3Ow==","took":109,"timed_out":false,"_shards":{"total":5,"successful":5,"failed":0},"hits":{"total":22601357,"max_score":0.0,"hits":[]}} 

la sua importante avere _scroll_id a portata di mano come il molto prossimo si SHD esegue il seguente comando

curl -XGET 'localhost:9200/_search/scroll' -d' 
    { 
     "scroll" : "1m", 
     "scroll_id" : "c2Nhbjs2OzM0NDg1ODpzRlBLc0FXNlNyNm5JWUc1" 
    } 
    ' 

Tuttavia, non penso la sua facile eseguirlo manualmente. La soluzione migliore è scrivere un codice java per fare lo stesso.

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(); 

Ora LOOP sull'ultimo comando utilizzare RicercaRisposta per estrarre i dati.

9

Questa è la soluzione migliore che ho trovato tramite il client di pitone

# 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

Utilizzando 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/en/elasticsearch/client/java-api/current/java-search-scrolling.html

5

Il modo migliore per regolare le dimensioni sta usando size = numbe r davanti alla URL

Curl -XGET "http://localhost:9200/logstash-*/_search?size=50&pretty" 

Nota: il valore massimo che può essere definito in questa dimensione è 10000. Per qualsiasi valore superiore a diecimila che si aspetta di utilizzare la funzione di scorrimento che riduca al minimo ogni possibilità di impatto per le prestazioni .

+0

Da quale versione si verifica la dimensione massima? – WoodyDRN

-2

È possibile utilizzare size = 0 questo restituirà tutti i documenti esempio

curl -XGET 'localhost:9200/index/type/_search' -d ' 
{ 
    size:0, 
    "query" : { 
    "match_all" : {} 
    } 
}' 
+1

Questo restituirà un'informazione accumulata, ma non i colpi stessi – user732456

+0

scusate, devo downvotare per fuorviando –

4

http://localhost:9200/foo/_search/? dimensioni = 1000 & abbastanza = 1

è necessario specificare parametro di query dimensione come il valore predefinito è 10

+1

che funziona grazie –

+0

siete i benvenuti @ hamzeh.hanandeh ..... contento questo ha aiutato qualcun altro –

5

È possibile utilizzare il _count API per ottenere il valore per il parametro size:

http://localhost:9200/foo/_count?q=<your query> 

Resi {count:X, ...}. estrarre valore 'X' e poi fare la query effettiva:

http://localhost:9200/foo/_search?q=<your query>&size=X 
1

dimensioni param aumenta i colpi visualizzati dal dal default (10) per 500.

http://localhost:9200/[indexName]/_search?pretty=true&size=500&q=*:*

Modificare il da passo passo per ottenere tutti i dati.

http://localhost:9200/[indexName]/_search?size=500&from=0
0

Per tornare tutti i record da tutti gli indici che si possono fare:

curl -XGET http://35.195.120.21:9200/_all/_search?size=50&pretty

uscita:

"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, 
     ...