615 Stimmen

Elasticsearch-Abfrage zur Rückgabe aller Datensätze

Ich habe eine kleine Datenbank in Elasticsearch und möchte zu Testzwecken alle Datensätze zurückholen. Ich versuche, eine URL in der Form...

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

Kann mir jemand die URL nennen, mit der Sie dies erreichen würden?

903voto

Steve Casey Punkte 9446

Ich denke, Lucene-Syntax wird so unterstützt:

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

Größe ist standardmäßig auf 10 eingestellt, so dass Sie möglicherweise auch &size=BIGNUMBER um mehr als 10 Artikel zu erhalten. (wobei BIGNUMBER einer Zahl entspricht, die Ihrer Meinung nach größer ist als Ihr Datensatz)

ABER, elasticsearch-Dokumentation schlägt vor für große Ergebnismengen mit der Suchart Scan.

EG:

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

und beantragen Sie dann weiter, wie in der oben verlinkten Dokumentation vorgeschlagen.

EDIT : scan Veraltet in 2.1.0.

scan bietet keine Vorteile gegenüber einer normalen scroll Anfrage sortiert nach _doc . Link zu elastischen Dokumenten (entdeckt von @christophe-roussy)

183voto

lfender6445 Punkte 29514
http://127.0.0.1:9200/foo/_search/?size=1000&pretty=1
                                   ^

Beachten Sie die Größe param , wodurch sich die Anzahl der angezeigten Treffer von der Standardeinstellung (10) auf 1000 pro Scherbe erhöht.

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

48voto

Prerak Diwan Punkte 479

Elasticsearch(ES) unterstützt sowohl eine GET- als auch eine POST-Anfrage zum Abrufen der Daten aus dem ES-Cluster-Index.

Wenn wir ein GET machen:

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

Wenn wir einen POST machen:

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

Ich würde vorschlagen, ein UI-Plugin mit elasticsearch zu verwenden http://mobz.github.io/elasticsearch-head/ Auf diese Weise können Sie ein besseres Gefühl für die von Ihnen erstellten Indizes bekommen und Ihre Indizes auch testen.

35voto

vjpandian Punkte 604

Anmerkung: Die Antwort bezieht sich auf eine ältere Version von Elasticsearch 0.90 . Seither erschienene Versionen haben eine aktualisierte Syntax. Bitte beachten Sie die anderen Antworten, die möglicherweise eine genauere Antwort auf die von Ihnen gesuchte aktuelle Antwort geben.

Die nachstehende Abfrage würde die NO_OF_RESULTS zurückgeben, die Sie zurückgeben möchten.

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

Die Frage, die sich hier stellt, ist, ob Sie alle die zurückzusendenden Datensätze. Bevor Sie also eine Abfrage schreiben, werden Sie natürlich nicht den Wert von NO_OF_RESULTS .

Woher wissen wir, wie viele Datensätze in Ihrem Dokument vorhanden sind? Geben Sie einfach die folgende Abfrage ein

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

Dies würde zu einem Ergebnis führen, das wie das folgende aussieht

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

Das Ergebnis insgesamt sagt Ihnen, wie viele Datensätze in Ihrem Dokument vorhanden sind. Das ist also eine gute Möglichkeit, den Wert von NO_OF ERGEBNISSE

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

Suche nach allen Typen in allen Indizes

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

Alle Typen im Index foo suchen

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

Suche nach allen Typen in den Indizes foo1 und foo2

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

Suche nach allen Typen in allen Indizes, die mit f beginnen

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

Sucharten Benutzer und Tweet in allen Indizes

26voto

Holm Punkte 2591

Dies ist die beste Lösung, die ich mit dem Python-Client gefunden habe

  # 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

Java-Client verwenden

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

CodeJaeger.com

CodeJaeger ist eine Gemeinschaft für Programmierer, die täglich Hilfe erhalten..
Wir haben viele Inhalte, und Sie können auch Ihre eigenen Fragen stellen oder die Fragen anderer Leute lösen.

Powered by:

X