2017-01-14 75 views
7

Problem:pobierania więcej niż 10000 wyników w elastycznego wyszukiwania poprzez wyszukiwanie w zapytaniu GET/wyszukiwaniaELK: Jak mogę odzyskać więcej niż 10000 wyników/wydarzenia w Elastic-search

GET hostname:port /myIndex/_search { 
"size": 10000, 
"query" : { 
    "term" : { "field" : "myField" } 
}} 

mam był przy użyciu opcji rozmiar wiedząc, że

index.max_result_window = 100000

Ale jeśli moje zapytanie zwróci 650000 na przykład lub nawet więcej, jak mogę je odzyskać w tym samym GET.

Czytałem o interfejsie SCROLL, FROM-TO i PAGINATION, ale wszystkie z nich, gdy są stosowane, nigdy nie dostarczają więcej niż 10K.

To jest przykład pokazów na Forum Elasticsearch i używałem tego.

GET /_search?scroll=1m 

Czy jest jakiś przykład, w którym można pobrać wszystkie dokumenty dla zapytania wyszukiwania GET?

Dziękuję bardzo.

Odpowiedz

6

Przewiń jest sposobem, aby przejść do dużej liczby dokumentów, wysoko w tym sensie, że przekracza limit 10000, który można podnieść.

Pierwszy wniosek musi określić kwerendę, którą chcesz zrobić, a parametr scroll z czasem trwania before the search context times out (1 minuta w poniższym przykładzie)

POST /index/type/_search?scroll=1m 
{ 
    "size": 1000, 
    "query": { 
     "match" : { 
      "title" : "elasticsearch" 
     } 
    } 
} 

W odpowiedzi na tego pierwszego, masz _scroll_id że trzeba użyć, aby drugie połączenie:

POST /_search/scroll 
{ 
    "scroll" : "1m", 
    "scroll_id" : "DXF1ZXJ5QW5kRmV0Y2gBAAAAAAAAAD4WYm9laVYtZndUQlNsdDcwakFMNjU1QQ==" 
} 

w każdej kolejnej odpowiedzi, dostaniesz nową _scroll_id że trzeba użyć dla następnego połączenia, dopóki nie retri ile masz potrzebnych dokumentów.

więc w pseudo kod wygląda nieco jak poniżej:

# first request 
response = request('POST /index/type/_search?scroll=1m') 
docs = [ response.hits ] 
scroll_id = response._scroll_id 

# subsequent requests 
while (true) { 
    response = request('POST /_search/scroll', scroll_id) 
    docs.push(response.hits) 
    scroll_id = response._scroll_id 
} 
+0

Thanks val. Nie jestem pewien, czy mogę to zrobić z curl w php. O ile nie mogę parametryzować identyfikatora get scroll i wiedzieć z góry, ile dokumentów będę musiał pobrać. Widzisz, nie używam sensu ani nie kibana. Muszę użyć wykresu google, aby dokonać wcześniejszych agregacji i muszę wysłać zapytanie elastyczne, aby uzyskać dwa duże zbiory danych. Regex je i zapisz wynik w tablicach. Elastyczne api może być bardzo egzotyczne. Czy uważasz, że istnieje prostszy sposób na odzyskanie wszystkich danych? Czy można zwiększyć wartość maksymalną indeksu? Czy jest jakaś prostsza metoda używania identyfikatora przewijania? – HashGuy81

+0

Możesz zdecydowanie [zwiększyć wartość 'index.max_result_window'] (https://www.elastic.co/guide/en/elasticsearch/reference/5.1/index-modules.html#dynamic-index-settings), ale Ty" Ryzykujesz upadkiem klastra, jeśli chcesz uzyskać 650000 dokumentów za jednym razem. – Val

+0

Inną możliwością jest zapytanie ES z poziomu Google Script, dzięki czemu łatwiej jest zintegrować wyniki z wykresami Google. – Val