2009-06-08 3 views
19

본질적으로 페이지 매김을 지원하지 않으므로 Lucene에서 페이지 매김을 달성하는 방법을 알고 싶습니다. 기본적으로 '상위 10 개 항목'(일부 매개 변수 기반)과 '다음 10 개 항목'등을 검색해야합니다. 그리고 동시에 Lucene이 기억을 부추길 원하지 않습니다. 조언이 있으면 좋을 것 같습니다. 미리 감사드립니다. lucene에서 페이지 매김을 달성하는 방법은 무엇입니까?

+0

확인이 게시물의 승인 답 : [루씬 4 매김] [1] 가 [1] : http://stackoverflow.com/a/24533377/1080485 –

답변

20

다음과 비슷한 자체 페이징 메커니즘을 적용해야합니다.

IList<Document> luceneDocuments = new List<Document>(); 

IndexReader indexReader = new IndexReader(directory); 
Searcher searcher = new IndexSearcher(indexReader); 

TopDocs results = searcher.Search("Your Query", null, skipRecords + takeRecords); 
ScoreDoc[] scoreDocs = results.scoreDocs; 

for (int i = skipRecords; i < results.totalHits; i++) 
{ 
     if (i > (skipRecords + takeRecords) - 1) 
     { 
      break; 
     } 

     luceneDocuments.Add(searcher.Doc(scoreDocs[i].doc)); 
} 

당신은 searcher.Doc 메소드가 호출 될 때까지 인덱스에 포함 된 데이터가 실제로 사용되지 않기 때문에 scoreDocs 배열을 반복하는 경량 될 것입니다 찾을 수 있습니다.

이 예제는 Lucene.NET 2.3.2의 약간 수정 된 버전에 대해 작성된 것이지만 기본 원칙은 모든 최신 버전의 Lucene에 대해 작동해야합니다.

+1

동의 Lucene의 결과는 데이터베이스 질의시 결과만큼 큼지 않으므로 성능 문제를 다루지 않고도 사용자 정의 페이지 매김 메소드를 쉽게 구현할 수 있습니다. –

+1

더 많은 페이지 번호 매김을 가진 큰 데이터 세트를 검색 할 때 검색 속도가 느려집니다 . 그것은 당신이 물건을 찾은 다음 검색의 일부를 생략하는 것과 같습니다. – Ruwantha

11

Kane의 코드 스 니펫으로 계속 진행되는 또 다른 루프 버전입니다.

.................... 

ScoreDoc[] scoreDocs = results.scoreDocs; 
int pageIndex = [User Value]; 
int pageSize = [Configured Value]; 

int startIndex = (pageIndex - 1) * pageSize; 
int endIndex = pageIndex * pageSize; 
endIndex = results.totalHits < endIndex? results.totalHits:endIndex; 

for (int i = startIndex ; i < endIndex ; i++) 
{ 
    luceneDocuments.Add(searcher.Doc(scoreDocs[i].doc)); 
} 
2

다음과 같은 방법으로 페이지 매기기를 사용하면 도움이 될 수 있습니다. 특히 실적 관점에서 더 나은 전략을 알고 있다면 공유하십시오.

public TopDocs search(String query, int pageNumber) throws IOException, ParseException { 
     Query searchQuery = parser.parse(query); 
     TopScoreDocCollector collector = TopScoreDocCollector.create(1000, true); 

     int startIndex = (pageNumber - 1) * MyApp.SEARCH_RESULT_PAGE_SIZE; 
     searcher.search(searchQuery, collector); 

     TopDocs topDocs = collector.topDocs(startIndex, MyApp.SEARCH_RESULT_PAGE_SIZE); 
     return topDocs; 
    } 
관련 문제