2016-06-13 4 views
3

폴더에 문서가 거의없고이 폴더의 모든 문서에 대한 색인이 생성되었는지 확인하고 싶습니다. 이렇게하려면 폴더의 각 문서 이름에 대해 ES에서 인덱싱 된 문서에 대한 루프를 실행하고 비교하고 싶습니다. 그래서 모든 문서를 검색하고 싶습니다. 문서는 그 때부터 변경으로모든 레코드를 검색하기위한 탄성 검색 검색 쿼리 NEST

retrieve all records in a (ElasticSearch) NEST queryenter link description here 그러나 그들이 나를 도와 didnt가 같은 동일한 질문의 몇 가지 다른 가능한 중복이있다. 내가 사용하려고

(현재 문서의 스캔에 대해 아무것도 없다) client.search<T>(). 그러나 문서에 따라 기본 값 10 개가 검색됩니다. 나는 기록의 크기를 언급하지 않고 모든 기록을 얻고 싶습니까? (인덱스의 크기가 변하기 때문에)

또는 인덱스의 크기를 먼저 가져온 다음이 숫자를 입력으로 가져 와서 모든 문서와 루프를 가져올 수 있습니까?

+0

당신이 스크롤을 사용하려고 했습니까? https://www.elastic.co/guide/en/elasticsearch/client/net-api/1.x/scroll.html –

+0

안녕하세요. 나는 그것을 사용해 보았고 scrollId를 얻을 수 있었다. 일단 scrollId를 얻으면, 모든 문서 목록을 검색 할 때까지 검색 쿼리를 다시 실행하는 방법을 알지 못합니다. 나는 NEST에서 같은 것을 찾지 않았다. (나는 2.x 버전의 문서를 검사하고 있었다. 어쨌든 당신이 게시 한 링크에서 주어진 예제로 시도 할 것이다.) 고마워. – ASN

+1

첫 번째 주석의 링크는 'scroll'의 검색 유형을 지정하는 검색을 실행 한 다음 스크롤 ID를 사용하여 결과의 ​​첫 번째 페이지를 가져옵니다. 그런 다음 마지막 응답에서 반환 된 스크롤 ID를 사용하여 모든 문서를 가져 오도록 반복합니다. 또한'fields'를 사용하여 전체 문서를 반환하는 대신 각 결과에 대해 문서의 한 필드 만 말하도록 할 수 있습니다. –

답변

4

여기 내 문제를 해결하는 방법입니다. 희망이 도움이됩니다. (참고 https://www.elastic.co/guide/en/elasticsearch/client/net-api/1.x/scroll.html, https://www.elastic.co/guide/en/elasticsearch/reference/current/search-request-scroll.html#scroll-search-context)

List<string> indexedList = new List<string>(); 
var scanResults = client.Search<ClassName>(s => s 
       .From(0) 
       .Size(2000) 
       .MatchAll() 
       .Fields(f=>f.Field(fi=>fi.propertyName)) //I used field to get only the value I needed rather than getting the whole document 
       .SearchType(Elasticsearch.Net.SearchType.Scan) 
       .Scroll("5m") 
      ); 

     var results = client.Scroll<ClassName>("10m", scanResults.ScrollId); 
     while (results.Documents.Any()) 
     { 
      foreach(var doc in results.Fields) 
      { 
       indexedList.Add(doc.Value<string>("propertyName")); 
      } 

      results = client.Scroll<ClassName>("10m", results.ScrollId); 
     } 

편집

var response = client.Search<Document>(s => s 
         .From(fromNum) 
         .Size(PageSize) 
         .Query(q => q .... 
+0

에서 사용할 수 있습니다. 논리를 이해하지 못합니다. 첫 번째 matchAll 쿼리는 2000 개의 문서 만 반환합니다. 2000 개 이상의 문서를 스크롤하고 있습니까? 5000 문서가 있으면 어떻게됩니까? – batmaci

+0

@batmaci 그 숫자 2000은 총 레코드 수가 아닙니다.그것은 스크롤에서 언급 한 시간 동안 유효 할 때마다 가져올 레코드 수입니다. (예를 들어, 0-10 레코드를 먼저 가져오고 11-20 레코드를 가져옵니다 .2000은 단지 예일뿐입니다.) – ASN

+0

이 값을 설정하는 것이 좋으면 알고 계십니까? 높은 숫자 또는 성능 문제가 발생할 수 있습니다. 내가 알고 있듯이 10,000은 검색 쿼리의 최대 횟수입니다. – batmaci