Mam małą bazę danych w Elasticsearch i do celów testowych chciałbym wycofać wszystkie rekordy. Próbuję użyć adresu URL formularza ...
http://localhost:9200/foo/_search?pretty=true&q={'matchAll':{''}}
Czy ktoś może mi podać adres URL, którego byś użył do osiągnięcia tego celu?
database
elasticsearch
query-string
elasticsearch-dsl
John Livermore
źródło
źródło
Odpowiedzi:
Myślę, że składnia Lucene jest obsługiwana, więc:
http://localhost:9200/foo/_search?pretty=true&q=*:*
rozmiar domyślnie wynosi 10, więc może być konieczne
&size=BIGNUMBER
uzyskanie więcej niż 10 elementów. (gdzie BIGNUMBER to liczba, która Twoim zdaniem jest większa niż Twój zestaw danych)ALE, dokumentacja elasticsearch sugeruje dla dużych zestawów wyników, używając typu wyszukiwania skanowania.
NA PRZYKŁAD:
a następnie nadal pytaj zgodnie z powyższym sugerowanym linkiem do dokumentacji.
EDYCJA:
scan
Przestarzałe w 2.1.0.scan
nie zapewnia żadnych korzyści w stosunku do zwykłegoscroll
zapytania posortowanego według_doc
. link do elastycznych dokumentów (zauważonych przez @ christophe-roussy)źródło
Zwróć uwagę na parametr wielkości , który zwiększa liczbę trafień wyświetlanych z wartości domyślnej (10) do 1000 na odłamek.
http://www.elasticsearch.org/guide/en/elasticsearch/reference/current/search-request-from-size.html
źródło
max_result_window
Elasticsearch (ES) obsługuje żądanie GET lub POST w celu uzyskania danych z indeksu klastrów ES.
Kiedy robimy GET:
Kiedy wykonujemy test POST:
Sugerowałbym użycie wtyczki UI z elasticsearch http://mobz.github.io/elasticsearch-head/ Pomoże ci to w lepszym odczuciu tworzonych indeksów, a także w testowaniu indeksów.
źródło
from
+size
nie może być większe niżindex.max_result_window
ustawienie indeksu, które domyślniecurl -XGET ... -d '{...}'
jest toun
oficjalny mieszany styl żądania. Dziękujemy za pokazanie poprawnych formatów GET i POST.Poniższe zapytanie zwróci NO_OF_RESULTS, które chcesz zwrócić.
Pytanie dotyczy tego, czy chcesz zwrócić wszystkie rekordy. Oczywiście przed napisaniem zapytania nie poznasz wartości NO_OF_RESULTS .
Skąd wiemy, ile rekordów znajduje się w twoim dokumencie? Po prostu wpisz zapytanie poniżej
To daje wynik, który wygląda jak ten poniżej
Wynik suma informuje, ile rekordów jest dostępnych w dokumencie. To dobry sposób na poznanie wartości WYNIKÓW BRAK
Wyszukaj wszystkie typy we wszystkich indeksach
Wyszukaj wszystkie typy w indeksie foo
Wyszukaj wszystkie typy w indeksach foo1 i foo2
Wyszukaj wszystkie typy w dowolnych indeksach zaczynających się na f
Typy wyszukiwania użytkownika i tweeta we wszystkich indeksach
źródło
To najlepsze rozwiązanie, jakie znalazłem za pomocą klienta python
https://gist.github.com/drorata/146ce50807d16fd4a6aa
Korzystanie z klienta Java
https://www.elastic.co/guide/en/elasticsearch/client/java-api/current/java-search-scrolling.html
źródło
elasticsearch_dsl==5.4.0
i działa bezsearch_type = 'scan',
.size=10000
, gdzieś pomiędzy 5-7 iteracjami. zstatus=127
,main ERROR Null object returned for RollingFile in Appenders
,main ERROR Unable to locate appender "rolling" for logger config "root"
Nie loguje się/var/log/elasticsearch/elasticsearch.log
scan
przypomnienia, klienci pythonów implementują pomocnika, który przewija pod maską (od wersji 5.xxsearch_type = 'scan'
jest przestarzałe. Podobny kod będzie działał bez tego, chociaż istnieją pewne interesujące różnice, które są dobrze zakopane w starej dokumentacji. elastic.co/guide/en/elasticsearch/reference/1.4/… W szczególności, gdy migrujesz, aby nie używać search_type = scan, to pierwsze zapytanie „search” otrzyma pierwszą serię wyników do przetworzenia.Elasticsearch będzie znacznie wolniejszy, jeśli dodasz dużą liczbę jako rozmiar, jedną z metod uzyskania wszystkich dokumentów jest użycie identyfikatorów skanowania i przewijania.
https://www.elastic.co/guide/en/elasticsearch/reference/current/search-request-scroll.html
W Elasticsearch w wersji 7.2 robisz to w następujący sposób:
Wyniki z tego będą zawierać _scroll_id, który musisz zapytać, aby uzyskać kolejne 100 porcji.
źródło
search_type=scan
jest teraz przestarzałe Powinieneś to usunąć, ale potem zachowanie nieco się zmieniło. Pierwsza partia danych wraca z pierwszego wywołania wyszukiwania. Podany link pokazuje prawidłowy sposób, aby to zrobić.użyj
server:9200/_stats
również, aby uzyskać statystyki dotyczące wszystkich twoich aliasów, takich jak rozmiar i liczba elementów na alias, co jest bardzo przydatne i dostarcza pomocnych informacjiźródło
Jeśli chcesz pobrać wiele tysięcy rekordów, to ... kilka osób udzieliło prawidłowej odpowiedzi przy użyciu „przewijania” (Uwaga: Niektóre osoby sugerowały również użycie „search_type = scan”. To było przestarzałe, a w wersji 5.0 usunięte. Nie potrzebujesz tego)
Zacznij od zapytania „szukaj”, ale określ parametr „przewijania” (tutaj używam limitu czasu 1 minuty):
Obejmuje to twoją pierwszą „serię” hitów. Ale nie skończyliśmy tutaj. Wyjście powyższego polecenia curl wyglądałoby mniej więcej tak:
Ważne jest, aby mieć przy sobie _scroll_id, ponieważ należy uruchomić następującą komendę:
Jednak przekazywanie scroll_id nie jest czymś, co można wykonać ręcznie. Najlepiej jest napisać kod, aby to zrobić. np. w java:
Teraz LOOP dla ostatniego polecenia użyj SearchResponse, aby wyodrębnić dane.
źródło
Prosty! Możesz użyć
size
ifrom
parametryzować!następnie zmieniasz
from
stopniowo, aż uzyskasz wszystkie dane.źródło
from
+size
nie mogą być większe niż index.max_result_window ustawienie indeksu, które domyślniefrom
isize
natkniesz się na problem głębokiej paginacji. Użyj przewijanego interfejsu API, aby wykonać zrzut wszystkich dokumentów.Najlepszym sposobem dostosowania rozmiaru jest użycie size = liczba przed adresem URL
Uwaga: maksymalna wartość, którą można zdefiniować w tym rozmiarze, to 10000. Dla każdej wartości powyżej dziesięciu tysięcy oczekuje się, że użyjesz funkcji przewijania, która zminimalizuje wszelkie szanse wpływu na wydajność.
źródło
Możesz użyć
_count
interfejsu API, aby uzyskać wartośćsize
parametru:Powraca
{count:X, ...}
. Wyodrębnij wartość „X”, a następnie wykonaj rzeczywiste zapytanie:źródło
http: // localhost: 9200 / foo / _search / ? rozmiar = 1000 i ładny = 1
musisz podać parametr zapytania o rozmiar, ponieważ domyślnie jest to 10
źródło
size param zwiększa liczbę wyświetlanych trafień z wartości domyślnej (10) do 500.
Zmiana z krok po kroku, aby uzyskać wszystkie dane.
źródło
Dla Elasticsearch 6.x
Żądanie:
GET /foo/_search?pretty=true
Odpowiedź: W Hits-> total, podaj liczbę dokumentów
źródło
Jeśli jest to mały zestaw danych (np. Rekordy 1K) , możesz po prostu określić
size
:Zapytania cały mecz nie jest potrzebna, ponieważ jest niejawny.
Jeśli masz średni zestaw danych, na przykład rekordy 1M , możesz nie mieć wystarczającej ilości pamięci, aby go załadować, więc potrzebujesz przewijania .
Przewijanie jest jak kursor w DB. W Elasticsearch zapamiętuje miejsce, w którym zostało przerwane i zachowuje ten sam widok indeksu (tj. Zapobiega wyszukiwaniu odejść z odświeżeniem , zapobiega scalaniu segmentów ).
Pod względem API musisz dodać parametr przewijania do pierwszego żądania:
Otrzymujesz pierwszą stronę i identyfikator przewijania:
Pamiętaj, że zarówno odzyskany identyfikator przewijania, jak i limit czasu są ważne na następnej stronie . Częstym błędem jest tutaj określenie bardzo dużego limitu czasu (wartości
scroll
), który obejmowałby przetwarzanie całego zestawu danych (np. 1M rekordów) zamiast jednej strony (np. 100 rekordów).Aby uzyskać następną stronę, wpisz ostatni identyfikator przewijania i limit czasu, który powinien trwać do momentu pobrania następującej strony:
Jeśli masz dużo do wyeksportowania (np. Dokumenty 1B) , zrób to równolegle. Można to zrobić za pomocą przewijania w plasterkach . Powiedz, że chcesz wyeksportować 10 wątków. Pierwszy wątek wysłałby takie żądanie:
Otrzymujesz pierwszą stronę i identyfikator przewijania, dokładnie tak jak normalne żądanie przewijania. Zużyłbyś go dokładnie tak, jak zwykły zwój, z tą różnicą, że dostajesz 1/10 danych.
Inne wątki zrobiłyby to samo, z wyjątkiem
id
1, 2, 3 ...źródło
źródło
Domyślnie Elasticsearch zwraca 10 rekordów, więc rozmiar należy podać jawnie.
Dodaj rozmiar z prośbą o uzyskanie pożądanej liczby rekordów.
http: // {host}: 9200 / {nazwa_indeksu} / _search? pretty = true & size = (liczba rekordów)
Uwaga: Maksymalny rozmiar strony nie może być większy niż ustawienie indeksu index.max_result_window, domyślnie 10 000.
źródło
Od Kibana DevTools jego:
źródło
Proste rozwiązanie wykorzystujące pakiet python elasticsearch-dsl :
Zobacz także https://elasticsearch-dsl.readthedocs.io/en/latest/api.html#elasticsearch_dsl.Search.scan .
źródło
Maksymalny wynik, który zwróci elasticSearch, wynosi 10000, podając rozmiar
Następnie musisz użyć interfejsu API przewijania, aby uzyskać wynik, uzyskać wartość _scroll_id i umieścić tę wartość w scroll_id
źródło
Oficjalna dokumentacja zawiera odpowiedź na to pytanie! możesz to znaleźć tutaj .
Po prostu zastępujesz rozmiar (1) liczbą wyników, które chcesz zobaczyć!
źródło
Aby zwrócić wszystkie rekordy ze wszystkich indeksów, możesz:
curl -XGET http://35.195.120.21:9200/_all/_search?size=50&pretty
Wynik:
źródło
źródło
Żaden oprócz @Akira Sendoh nie odpowiedział, jak faktycznie uzyskać WSZYSTKIE dokumenty. Ale nawet to rozwiązanie powoduje awarię usługi ES 6.3 bez dzienników. Jedyną rzeczą, która działała dla mnie przy użyciu
elasticsearch-py
biblioteki niskiego poziomu, był pomocnik skanowania korzystający zscroll()
interfejsu API:Jednak obecnie bardziej przejrzystym sposobem wydaje się być
elasticsearch-dsl
biblioteka, która oferuje więcej abstrakcyjnych, czystszych wywołań, np .: http://elasticsearch-dsl.readthedocs.io/en/latest/search_dsl.html#hitsźródło
Jeśli nadal ktoś szuka wszystkich danych do pobrania z Elasticsearch, takich jak ja, w niektórych przypadkach użycia, oto co zrobiłem. Ponadto wszystkie dane oznaczają wszystkie indeksy i wszystkie typy dokumentów. Używam Elasticsearch 6.3
Odwołanie do Elasticsearch
źródło
to jest zapytanie, aby osiągnąć to, czego chcesz (sugeruję użyć Kibany, ponieważ pomaga lepiej zrozumieć zapytania)
aby uzyskać wszystkie rekordy, musisz użyć zapytania „match_all”.
rozmiar to liczba rekordów, które chcesz pobrać (rodzaj limitu). domyślnie ES zwróci tylko 10 rekordów
od jest jak pomiń, pomiń pierwsze 3 rekordy.
Jeśli chcesz pobrać dokładnie wszystkie rekordy, po prostu użyj wartości z pola „suma” z wyniku po trafieniu tego zapytania z Kibany i użyj go z „rozmiarem”.
źródło
Korzystanie z Elasticsearch 7.5.1
w przypadku, gdy możesz również określić rozmiar tablicy za pomocą & size = $ {liczba}
na wypadek, gdybyś nie indeksował
źródło
Można użyć konsoli kibana i my_index jako indeksu do wyszukiwania następujących elementów. Prosząc indeks, aby zwrócił tylko 4 pola indeksu, możesz także dodać rozmiar, aby wskazać, ile dokumentów chcesz zwrócić przez indeks. Począwszy od wersji ES 7.6 powinieneś używać _source zamiast filtrować, ponieważ zareaguje szybciej.
źródło
Możesz użyć size = 0, aby otrzymać przykład wszystkich dokumentów
źródło