2013-06-28 11 views
5

Mam taki kod z Lucene. Czy ktoś może dostarczyć próbkę lub wskazówki, jak zrobić paginację z Lucene?Pagacja Lucene z TopScoreDocCollector

Query q = queryParser.parse(useQuery); 
TopScoreDocCollector collector = TopScoreDocCollector.create(maxReturn, true); 
searcher.search(q, collector); 

Dzięki.

+0

czeku zatwierdzony odpowiedzi w tym poście: [Lucene 4 paginacji] [1] [1]: http://stackoverflow.com/a/24533377/1080485 –

Odpowiedz

2

Możesz uzyskać TopDocs reprezentujące konkretną stronę wyników, używając TopDocsCollector.topDocs(int). Pamiętaj, że start argument wskazuje, jak wiele dokumentów powinno zacząć, a nie jak wielu „stron”, a więc coś takiego:

TopDocs hits = collector.topDocs(maxReturn*page); 

jest zazwyczaj odpowiednie (gdzie page jest numerowany od 0)

+1

Jak połączyć to z 'obiektu Sort'? Chciałbym posortować, a następnie wyodrębnić kawałek z tego. –

+1

@ Michael-O Ty nie. Używanie 'TopScoreDocCollector' z' Sortuj' nie ma sensu. 'TopScoreDocCollector' jawnie sortuje według najlepszego wyniku. Jeśli wolisz używać kolektora, użyj zamiast niego ['TopFieldCollector'] (http://lucene.apache.org/core/4_0_0/core/org/apache/lucene/search/TopFieldCollector.html). Możesz także po prostu wywołać "IndexSearcher.search (zapytanie Query, int n, Sort sort)" dla pierwszego zapytania, a następnie dla kolejnych stron wywołać 'IndexSearcher.searchAfter (ScoreDoc po, zapytanie Query, int n, Sort sort) , przekazując ostatni wynik zwrócony jako argument "po". – femtoRgon

+0

OK, dzięki. Używam już wspomnianej metody 'search', ale' searchAfter' nie pomoże, ponieważ eksponuję je za pomocą interfejsu REST API i nie mam do tego celu dokumentu "after". Potrzebowałbym czegoś takiego jak 'search (zapytanie, od, size, sort)'. Ani 'TopScopeDocC ...', 'TopFieldC ...' nie 'searchAfter' zrobi, niestety. Jedyną dostępną opcją jest pobranie wszystkich "ScoreDocs" i ręczne zaimplementowanie paginacji. –