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?

23voto

Radu Gheorghe Punkte 854

Wenn es sich um einen kleinen Datensatz handelt (z. B. 1K Datensätze) können Sie einfach angeben size :

curl localhost:9200/foo_index/_search?size=1000

Le site alle Abfragen abgleichen ist nicht erforderlich, da sie implizit ist.

Wenn Sie einen mittelgroßen Datensatz haben, etwa 1 Million Datensätze haben Sie möglicherweise nicht genug Speicherplatz, um sie zu laden, so dass Sie eine Blättern Sie .

Eine Schriftrolle ist wie ein Cursor in einer DB. In Elasticsearch merkt er sich, wo man aufgehört hat und behält die gleiche Ansicht des Indexes bei (d.h. er verhindert, dass der Suchende mit einem aktualisieren verhindert Segmente aus der Verschmelzung ).

API-mäßig müssen Sie der ersten Anfrage einen Scroll-Parameter hinzufügen:

curl 'localhost:9200/foo_index/_search?size=100&scroll=1m&pretty'

Sie erhalten die erste Seite und eine Bildlauf-ID zurück:

{
  "_scroll_id" : "DXF1ZXJ5QW5kRmV0Y2gBAAAAAAAAADEWbmJlSmxjb2hSU0tMZk12aEx2c0EzUQ==",
  "took" : 0,
...

Denken Sie daran, dass sowohl die zurückgegebene Bildlauf-ID als auch die Zeitüberschreitung gelten für die nächste Seite . Ein häufiger Fehler ist hier die Angabe eines sehr großen Timeouts (Wert von scroll ), die für die Verarbeitung des gesamten Datensatzes (z. B. 1 Mio. Datensätze) anstelle einer Seite (z. B. 100 Datensätze) ausreichen würde.

Um die nächste Seite zu erhalten, geben Sie die letzte Bildlauf-ID und eine Zeitüberschreitung ein, die bis zum Abruf der nächsten Seite dauern soll:

curl -XPOST -H 'Content-Type: application/json' 'localhost:9200/_search/scroll' -d '{
  "scroll": "1m",
  "scroll_id": "DXF1ZXJ5QW5kRmV0Y2gBAAAAAAAAADAWbmJlSmxjb2hSU0tMZk12aEx2c0EzUQ=="
}'

Wenn Sie viel zu exportieren haben (z. B. 1B Dokumente) werden Sie parallelisieren wollen. Dies kann geschehen über geschnittene Schnecke . Angenommen, Sie möchten in 10 Threads exportieren. Der erste Thread würde eine Anfrage wie diese stellen:

curl -XPOST -H 'Content-Type: application/json' 'localhost:9200/test/_search?scroll=1m&size=100' -d '{
  "slice": {
    "id": 0, 
    "max": 10 
  }
}'

Sie erhalten die erste Seite und eine Bildlauf-ID zurück, genau wie bei einer normalen Bildlaufanforderung. Sie verbrauchen es genau wie einen normalen Bildlauf, außer dass Sie nur 1/10 der Daten erhalten.

Andere Themen würden dasselbe tun, außer dass id wäre 1, 2, 3...

20voto

Somum Punkte 2162

Wenn Sie viele Tausende von Datensätzen abrufen wollen, dann... haben ein paar Leute die richtige Antwort gegeben, indem sie "scroll" verwendet haben (Anmerkung: Einige Leute haben auch vorgeschlagen, "search_type=scan" zu verwenden. Dies war veraltet und wurde in v5.0 entfernt. Sie brauchen es nicht)

Beginnen Sie mit einer "Such"-Abfrage, geben Sie aber einen "Scroll"-Parameter an (hier verwende ich eine Zeitüberschreitung von 1 Minute):

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

Das gilt auch für Ihre erste "Charge" von Treffern. Aber wir sind hier noch nicht fertig. Die Ausgabe des obigen curl-Befehls würde etwa so aussehen:

{"\_scroll\_id":"c2Nhbjs1OzUyNjE6NU4tU3BrWi1UWkNIWVNBZW43bXV3Zzs1Mzc3OkhUQ0g3VGllU2FhemJVNlM5d2t0alE7NTI2Mjo1Ti1TcGtaLVRaQ0hZU0FlbjdtdXdnOzUzNzg6SFRDSDdUaWVTYWF6YlU2Uzl3a3RqUTs1MjYzOjVOLVNwa1otVFpDSFlTQWVuN211d2c7MTt0b3RhbF9oaXRzOjIyNjAxMzU3Ow==","took":109,"timed\_out":false,"\_shards":{"total":5,"successful":5,"failed":0},"hits":{"total":22601357,"max\_score":0.0,"hits":\[\]}}

Es ist wichtig, dass Sie _scroll_id zur Hand haben, denn als Nächstes sollten Sie den folgenden Befehl ausführen:

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

Die Weitergabe der scroll_id ist jedoch nicht dafür gedacht, manuell durchgeführt zu werden. Am besten ist es, wenn Sie einen entsprechenden Code schreiben, z. B. in 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();

Jetzt LOOP auf den letzten Befehl verwenden SearchResponse, um die Daten zu extrahieren.

18voto

WoodyDRN Punkte 1141

Elasticsearch erhält bedeutsam Langsamer, wenn Sie nur eine große Zahl als Größe angeben. Eine Methode, um alle Dokumente zu erhalten, ist die Verwendung von Scan- und Scroll-IDs.

https://www.elastic.co/guide/en/elasticsearch/reference/current/search-request-scroll.html

In Elasticsearch v7.2 machen Sie das so:

POST /foo/_search?scroll=1m
{
    "size": 100,
    "query": {
        "match_all": {}
    }
}

Die Ergebnisse würden eine _scroll_id enthalten, die Sie abfragen müssen, um die nächsten 100 Chunks zu erhalten.

POST /_search/scroll 
{
    "scroll" : "1m", 
    "scroll_id" : "<YOUR SCROLL ID>" 
}

12voto

Oussama L. Punkte 1764

使い道 server:9200/_stats auch um Statistiken über alle Ihre Aliase zu erhalten.. wie Größe und Anzahl der Elemente pro Alias, das ist sehr nützlich und liefert hilfreiche Informationen

8voto

Kraken Punkte 4010

Sie müssen eigentlich keinen Körper an match_all kann dies mit einer GET-Anfrage an die folgende URL geschehen. Dies ist die einfachste Form.

http://localhost:9200/foo/_search

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