2017-10-06 2 views
1

스크롤 기능으로 Elasticsearch에서 약간 혼란 스럽습니다. elasticsearch에서 사용자가 결과 집합을 스크롤 할 때마다 검색 API를 호출 할 수 있습니까? 문서탄성 검색 스크롤

"search_type" => "scan", // use search_type=scan 
"scroll" => "30s",   // how long between scroll requests. should be small! 
"size" => 50,    // how many results *per shard* you want back 

에서 는 그것이 30 초마다에 대한 검색을 수행 할 의미가 더 기록이 없을 때까지 모든 결과 세트를 반환?

예를 들어 내 ES는 총 500 개의 레코드를 반환합니다. 나는 250 레코드가있는 두 세트의 레코드로 ES로부터 데이터를 얻고 있습니다. 사용자가 250 레코드의 두 번째 세트를 스크롤 할 때 처음 250 세트의 레코드를 표시 할 수있는 방법이 있습니까?

답변

0

scroll 속성의 목적이 잘못 이해하고 있습니다. 그것은 elasticsearch가 30 초 후에 다음 페이지 데이터를 가져올 것이라는 것을 의미하지 않습니다. 첫 번째 스크롤 요청을 할 때 스크롤 컨텍스트를 닫아야 할시기를 지정해야합니다. scroll 매개 변수가 30 초 후에 스크롤 컨텍스트를 닫으려고합니다.

첫 번째 스크롤 요청 후 응답으로 scroll_id 매개 변수가 반환됩니다. 다음 페이지의 경우 스크롤 응답의 다음 페이지를 가져 오기 위해 해당 값을 전달해야합니다. 30 초 내에 다음 스크롤 요청을하지 않으면 스크롤 요청이 닫히고 해당 스크롤 요청에 대한 다음 페이지를 가져올 수 없습니다.

1

예제 사용 사례로 설명한 내용은 실제로는 search results pagination이며 모든 검색어에 사용할 수 있으며 10k 개의 결과로 제한됩니다. scroll 쿼리를 사용하면 문서 전체 컬렉션을 가져올 수있는 10k 한도를 초과해야하는 경우에 scroll 요청이 필요합니다.

아마도 여기서 혼란의 원인은 scroll이라는 용어가 모호하다는 것입니다. 이는 검색어의 유형을 의미하며, 또한이 검색어의 매개 변수 이름입니다 (other comments에 언급 된 바와 같이, 당신이 스크롤의 다음 덩어리를 가져 오기를 기다리고).

scroll 쿼리가 무거 우므로 절대적으로 필요한 경우를 피하십시오. 사실, 그것은 말한다 docs 에 :

스크롤 실시간으로 사용자 요청을위한 것이 아니라, 오히려 많은 양의 데이터를 처리하기 위해 ...

는 이제 또 다른 질문에 대한 :

elasticsearch에서는 사용자가 결과 집합을 스크롤 할 때마다 검색 API를 호출 할 수 있습니까?

, 심지어 몇 parallel scroll requests 가능하다 :

각 스크롤을받지 않으며, 임의 스크롤 요청 등에 병렬로 처리 될 수있다.

1

찾고있는 것은 페이지 매김입니다.

고정 된 크기를 쿼리하고 from 매개 변수를 설정하여 목표를 달성 할 수 있습니다.250 개의 결과로 배치를 표시하려면 size = 250을 설정하고 각 연속 쿼리에서 from의 값을 250만큼 증가시킵니다. 반대로

GET /_search?size=250      ---- return first 250 results 
GET /_search?size=250&from=250   ---- next 250 results 
GET /_search?size=250&from=500   ---- next 250 results 

, Scan & scroll는 단일 검색과 결과의 큰 집합을 검색하고 이상적으로 새 인덱스로 재 색인 데이터와 같은 작업을 의미 할 수 있습니다. 검색 결과를 실시간으로 표시하는 데 사용하지 않는 것이 좋습니다.

간단히 설명하면 Scan & scroll은 스캔 요청과 함께 제공된 쿼리의 인덱스를 검색하고 scrol_id을 반환합니다. 이 scroll_id은 결과의 다음 일괄 처리를 반환하기 위해 다음 스크롤 요청으로 전달 될 수 있습니다.

는 스크롤러가 초기화 happen-

  • 다음, 위의 예에서 예 -

    # 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 
    

    을 다음과 같은 이벤트를 생각해 보자. scroll_id와 함께 첫 번째 결과 묶음을 반환합니다.

  • 각 후속 스크롤 요청에 대해 업데이트 된 scroll_id (이전 스크롤 요청에서 수신 됨)이 전송되고 다음 번 결과 집합이 반환됩니다.
  • 기본적으로 스크롤 시간은 검색 컨텍스트가 활성 상태로 유지되는 시간입니다. 다음 스크롤 요청이 설정된 시간 내에 전송되지 않으면 검색 컨텍스트가 손실되고 결과가 반환되지 않습니다. 따라서 수많은 문서가 포함 된 색인의 실시간 결과 표시에는 사용해서는 안됩니다.