Ich habe eine kleine Datenbank in Elasticsearch und möchte zu Testzwecken alle Datensätze zurückziehen. Ich versuche eine URL des Formulars zu verwenden ...
http://localhost:9200/foo/_search?pretty=true&q={'matchAll':{''}}
Kann mir bitte jemand die URL geben, mit der Sie dies erreichen würden?
database
elasticsearch
query-string
elasticsearch-dsl
John Livermore
quelle
quelle
Antworten:
Ich denke, Lucene-Syntax wird unterstützt, also:
http://localhost:9200/foo/_search?pretty=true&q=*:*
Die Standardgröße ist 10, daher müssen Sie möglicherweise auch
&size=BIGNUMBER
mehr als 10 Artikel erhalten. (wobei BIGNUMBER einer Zahl entspricht, von der Sie glauben, dass sie größer als Ihr Datensatz ist)ABER die elasticsearch-Dokumentation schlägt für große Ergebnismengen die Verwendung des Scan-Suchtyps vor.
Z.B:
und fordern Sie dann weiter an, wie es der obige Dokumentationslink vorschlägt.
EDIT:
scan
Veraltet in 2.1.0.scan
bietet keine Vorteile gegenüber einer regulärenscroll
Anfrage, sortiert nach_doc
. Link zu elastischen Dokumenten (entdeckt von @ christophe-roussy)quelle
Beachten Sie den Größenparameter , der die angezeigten Treffer von Standard (10) auf 1000 pro Shard erhöht.
http://www.elasticsearch.org/guide/en/elasticsearch/reference/current/search-request-from-size.html
quelle
max_result_window
elasticsearch (ES) unterstützt sowohl eine GET- als auch eine POST-Anforderung zum Abrufen der Daten aus dem ES-Clusterindex.
Wenn wir ein GET machen:
Wenn wir einen POST machen:
Ich würde vorschlagen, ein UI-Plugin mit elasticsearch http://mobz.github.io/elasticsearch-head/ zu verwenden. Dies hilft Ihnen dabei, ein besseres Gefühl für die von Ihnen erstellten Indizes zu bekommen und auch Ihre Indizes zu testen.
quelle
from
+size
kann nicht mehr als dieindex.max_result_window
curl -XGET ... -d '{...}'
die offiziellen Dokumente, was einun
offizieller gemischter Anforderungsstil ist. Vielen Dank, dass Sie die richtigen GET- und POST-Formate angezeigt haben.Die folgende Abfrage würde die NO_OF_RESULTS zurückgeben, die Sie zurückgeben möchten.
Die Frage hier ist nun, dass Sie möchten, dass alle Datensätze zurückgegeben werden. Bevor Sie eine Abfrage schreiben, kennen Sie den Wert von NO_OF_RESULTS natürlich nicht .
Woher wissen wir, wie viele Datensätze in Ihrem Dokument vorhanden sind? Geben Sie einfach die folgende Abfrage ein
Dies würde Ihnen ein Ergebnis liefern, das wie das folgende aussieht
Das Ergebnis insgesamt sagen Ihnen , wie viele Datensätze in Ihrem Dokument verfügbar sind. Das ist also eine gute Möglichkeit, den Wert von NO_OF RESULTS zu ermitteln
Suchen Sie alle Typen in allen Indizes
Suchen Sie alle Typen im foo-Index
Suchen Sie alle Typen in den Indizes foo1 und foo2
Suchen Sie alle Typen in beliebigen Indizes, die mit f beginnen
Suchtypen Benutzer und Tweet in allen Indizes
quelle
Dies ist die beste Lösung, die ich mit dem Python-Client gefunden habe
https://gist.github.com/drorata/146ce50807d16fd4a6aa
Java-Client verwenden
https://www.elastic.co/guide/en/elasticsearch/client/java-api/current/java-search-scrolling.html
quelle
elasticsearch_dsl==5.4.0
und es funktioniert ohnesearch_type = 'scan',
.size=10000
zwischen der 5. und 7. Iteration zu scrollen . mitstatus=127
,main ERROR Null object returned for RollingFile in Appenders
,main ERROR Unable to locate appender "rolling" for logger config "root"
meldet Nein in/var/log/elasticsearch/elasticsearch.log
scan
Helfer, der den Bildlauf unter der Haube ausführt (seit Version 5.xxsearch_type = 'scan'
ist veraltet. Ähnlicher Code wird ohne das funktionieren, obwohl es einige interessante Unterschiede gibt, die in der alten Dokumentation gut vergraben sind. elastic.co/guide/en/elasticsearch/reference/1.4/… Insbesondere bei der Migration, bei der search_type = scan nicht verwendet wird, wird diese erste Suchabfrage mit dem ersten zu verarbeitenden Ergebnisstapel geliefert.Elasticsearch wird erheblich langsamer, wenn Sie nur eine große Zahl als Größe hinzufügen. Eine Methode zum Abrufen aller Dokumente ist die Verwendung von Scan- und Bildlauf-IDs.
https://www.elastic.co/guide/en/elasticsearch/reference/current/search-request-scroll.html
In Elasticsearch v7.2 gehen Sie folgendermaßen vor:
Die Ergebnisse daraus würden eine _scroll_id enthalten, die Sie abfragen müssen, um die nächsten 100 Blöcke zu erhalten.
quelle
search_type=scan
ist jetzt veraltet. Sie sollten das also entfernen, aber dann hat sich das Verhalten ein wenig geändert. Der erste Datenstapel stammt aus dem ersten Suchaufruf. Der von Ihnen angegebene Link zeigt die richtige Vorgehensweise.Verwenden
server:9200/_stats
Sie diese Option auch, um Statistiken über alle Ihre Aliase abzurufen. Wie Größe und Anzahl der Elemente pro Alias ist dies sehr nützlich und bietet hilfreiche Informationenquelle
Wenn Sie viele tausend Datensätze abrufen möchten, dann ... gaben einige Leute die richtige Antwort für die Verwendung von 'scroll' (Hinweis: Einige Leute schlugen auch die Verwendung von "search_type = scan" vor. Dies war veraltet und wurde in Version 5.0 entfernt. Du brauchst es nicht)
Beginnen Sie mit einer Suchabfrage, geben Sie jedoch einen 'Bildlauf'-Parameter an (hier verwende ich eine Zeitüberschreitung von 1 Minute):
Dazu gehört auch Ihre erste Treffermenge. Aber wir sind hier noch nicht fertig. Die Ausgabe des obigen Befehls curl wäre ungefähr so:
Es ist wichtig, _scroll_id zur Hand zu haben, da Sie als nächstes den folgenden Befehl ausführen sollten:
Das Weitergeben der scroll_id ist jedoch nicht für die manuelle Ausführung vorgesehen. Am besten schreiben Sie dazu Code. zB in Java:
Verwenden Sie jetzt LOOP für den letzten Befehl SearchResponse, um die Daten zu extrahieren.
quelle
Einfach! Sie können
size
undfrom
Parameter verwenden!Dann ändern Sie die
from
schrittweise, bis Sie alle Daten erhalten.quelle
from
+size
können nicht mehr als die Indexeinstellung index.max_result_window sein, die standardmäßig 10.000 istfrom
undsize
-Ansatz stoßen Sie auf das Problem der tiefen Paginierung. Verwenden Sie die Bildlauf-API, um einen Speicherauszug aller Dokumente zu erstellen.Der beste Weg, um die Größe anzupassen, ist die Verwendung von size = number vor der URL
Hinweis: Der maximale Wert, der in dieser Größe definiert werden kann, beträgt 10000. Für jeden Wert über zehntausend wird erwartet, dass Sie eine Bildlauffunktion verwenden, die das Risiko von Auswirkungen auf die Leistung minimiert.
quelle
Sie können die
_count
API verwenden, um den Wert für densize
Parameter abzurufen:Rückgabe
{count:X, ...}
. Extrahieren Sie den Wert 'X' und führen Sie dann die eigentliche Abfrage durch:quelle
http: // localhost: 9200 / foo / _search / ? Größe = 1000 & hübsch = 1
Sie müssen den Größenabfrageparameter angeben, da der Standardwert 10 ist
quelle
size param erhöht die angezeigten Treffer von Standard (10) auf 500.
Ändern Sie die von Schritt für Schritt, um alle Daten zu erhalten.
quelle
Für Elasticsearch 6.x.
Anfrage:
GET /foo/_search?pretty=true
Antwort: Geben Sie unter Treffer-> Gesamt die Anzahl der Dokumente an
quelle
Wenn es sich um einen kleinen Datensatz handelt (z. B. 1K-Datensätze) , können Sie einfach Folgendes angeben
size
:Die Abfrage "Alle übereinstimmen" wird nicht benötigt, da sie implizit ist.
Wenn Sie über ein mittelgroßes Dataset wie 1M-Datensätze verfügen, verfügen Sie möglicherweise nicht über genügend Speicher, um es zu laden. Daher benötigen Sie einen Bildlauf .
Ein Bildlauf ist wie ein Cursor in einer Datenbank. In Elasticsearch merkt es sich, wo Sie aufgehört haben, und behält die gleiche Ansicht des Index bei (dh verhindert, dass der Sucher eine Aktualisierung durchführt , und verhindert, dass Segmente zusammengeführt werden ).
In Bezug auf die API müssen Sie der ersten Anforderung einen Bildlaufparameter hinzufügen:
Sie erhalten die erste Seite und eine Bildlauf-ID zurück:
Denken Sie daran, dass sowohl die Bildlauf-ID, die Sie zurückerhalten, als auch das Zeitlimit für die nächste Seite gültig sind . Ein häufiger Fehler besteht darin, ein sehr großes Zeitlimit (Wert von
scroll
) anzugeben , das die Verarbeitung des gesamten Datensatzes (z. B. 1 Million Datensätze) anstelle einer Seite (z. B. 100 Datensätze) abdeckt.Um die nächste Seite zu erhalten, geben Sie die letzte Bildlauf-ID und eine Zeitüberschreitung ein, die bis zum Abrufen der folgenden Seite dauern soll:
Wenn Sie viel exportieren müssen (z. B. 1B-Dokumente) , möchten Sie parallelisieren. Dies kann über eine in Scheiben geschnittene Schriftrolle erfolgen . Angenommen, Sie möchten 10 Threads exportieren. Der erste Thread würde eine Anfrage wie folgt ausgeben:
Sie erhalten die erste Seite und eine Bildlauf-ID zurück, genau wie bei einer normalen Bildlaufanforderung. Sie würden es genau wie eine normale Schriftrolle verbrauchen, außer dass Sie 1/10 der Daten erhalten.
Andere Threads würden dasselbe tun, außer dass
id
dies 1, 2, 3 ...quelle
quelle
Standardmäßig gibt Elasticsearch 10 Datensätze zurück, daher sollte die Größe explizit angegeben werden.
Fügen Sie die Größe mit der Anfrage hinzu, um die gewünschte Anzahl von Datensätzen zu erhalten.
http: // {host}: 9200 / {index_name} / _search? pretty = true & size = (Anzahl der Datensätze)
Hinweis: Die maximale Seitengröße darf nicht mehr als die Indexeinstellung index.max_result_window betragen, die standardmäßig 10.000 beträgt.
quelle
Von Kibana DevTools ist es:
quelle
Eine einfache Lösung mit dem Python-Paket elasticsearch-dsl :
Siehe auch https://elasticsearch-dsl.readthedocs.io/en/latest/api.html#elasticsearch_dsl.Search.scan .
quelle
Das maximale Ergebnis, das von elasticSearch zurückgegeben wird, beträgt 10000, wenn die Größe angegeben wird
Danach müssen Sie die Scroll-API verwenden, um das Ergebnis abzurufen, den Wert _scroll_id abzurufen und diesen Wert in scroll_id einzufügen
quelle
Die offizielle Dokumentation gibt die Antwort auf diese Frage! Sie finden es hier .
Sie ersetzen einfach Größe (1) durch die Anzahl der Ergebnisse, die Sie sehen möchten!
quelle
So geben Sie alle Datensätze aus allen Indizes zurück:
curl -XGET http://35.195.120.21:9200/_all/_search?size=50&pretty
Ausgabe:
quelle
quelle
Keiner außer @Akira Sendoh hat geantwortet, wie man tatsächlich ALLE Dokumente erhält. Aber selbst diese Lösung stürzt meinen ES 6.3- Dienst ohne Protokolle ab. Das einzige, was bei der Verwendung der Low-Level-
elasticsearch-py
Bibliothek für mich funktioniert hat, war der Scan-Helfer , der diescroll()
API verwendet:Der sauberere Weg scheint heutzutage jedoch die
elasticsearch-dsl
Bibliothek zu sein, die abstraktere, sauberere Aufrufe bietet, z. B.: Http://elasticsearch-dsl.readthedocs.io/en/latest/search_dsl.html#hitsquelle
Wenn immer noch jemand nach allen Daten sucht, die von Elasticsearch abgerufen werden sollen, wie ich, habe ich Folgendes getan. Darüber hinaus bedeuten alle Daten, alle Indizes und alle Dokumenttypen. Ich verwende Elasticsearch 6.3
Elasticsearch Referenz
quelle
Dies ist die Abfrage, um das zu erreichen, was Sie wollen (ich schlage vor, Kibana zu verwenden, da dies hilft, Abfragen besser zu verstehen).
Um alle Datensätze zu erhalten, müssen Sie die Abfrage "match_all" verwenden.
Größe ist die Anzahl der Datensätze, die Sie abrufen möchten (Art der Begrenzung). Standardmäßig gibt ES nur 10 Datensätze zurück
von ist wie überspringen, überspringe die ersten 3 Datensätze.
Wenn Sie genau alle Datensätze abrufen möchten, verwenden Sie einfach den Wert aus dem Feld "total" aus dem Ergebnis, sobald Sie diese Abfrage von Kibana getroffen haben, und verwenden Sie sie mit "size".
quelle
Verwenden von Elasticsearch 7.5.1
Falls Sie die Größe Ihres Arrays auch mit & size = $ {number} angeben können
falls Sie nicht wissen, dass Sie indexieren
quelle
Die Verwendung der Kibana-Konsole und von my_index als Index für die Suche nach Folgendem kann dazu beitragen. Wenn Sie den Index bitten, nur 4 Felder des Index zurückzugeben, können Sie auch die Größe hinzufügen, um anzugeben, wie viele Dokumente vom Index zurückgegeben werden sollen. Ab ES 7.6 sollten Sie _source verwenden, anstatt zu filtern, da dies schneller reagiert.
quelle
Sie können size = 0 verwenden. Dadurch erhalten Sie alle Beispiele für Dokumente
quelle