2013-06-28 36 views
5

Tôi có một mã như thế này với Lucene. Ai đó có thể cung cấp một mẫu hoặc lời khuyên về cách làm cho việc phân trang với Lucene?Phân trang Lucene với TopScoreDocCollector

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

Cảm ơn.

+0

kiểm tra câu trả lời đã được phê duyệt trong bài viết này: [Lucene 4 Pagination] [1] [1]: http://stackoverflow.com/a/24533377/1080485 –

Trả lời

2

Bạn có thể nhận được TopDocs đại diện cho một trang kết quả cụ thể, sử dụng TopDocsCollector.topDocs(int). Hãy nhớ rằng lập luận start đại diện cho bao nhiêu tài liệu trong nó nên bắt đầu, không có bao nhiêu "trang", vì vậy cái gì đó như:

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

là thường thích hợp (nơi page được đánh số từ 0)

+1

làm thế nào để kết hợp này với một 'đối tượng Sort'? Tôi muốn sắp xếp và sau đó trích xuất một lát từ đó. –

+1

@ Michael-O Bạn không biết. Sử dụng 'TopScoreDocCollector' với' Sắp xếp' không có ý nghĩa. 'TopScoreDocCollector' sắp xếp rõ ràng theo điểm số cao nhất. Nếu bạn thích sử dụng bộ sưu tập, hãy sử dụng ['TopFieldCollector'] (http://lucene.apache.org/core/4_0_0/core/org/apache/lucene/search/TopFieldCollector.html) để thay thế. Bạn cũng có thể chỉ cần gọi 'IndexSearcher.search (Truy vấn truy vấn, int n, Sắp xếp sắp xếp)' cho truy vấn đầu tiên, và sau đó cho các trang tiếp theo, gọi 'IndexSearcher.searchAfter (ScoreDoc after, Query query, int n, Sort sort)' , chuyển kết quả cuối cùng được trả về dưới dạng đối số "sau". – femtoRgon

+0

OK, cảm ơn. Tôi đã sử dụng phương thức 'search' đã đề cập nhưng' searchAfter' sẽ không giúp ích gì bởi vì tôi giới thiệu chúng với một API REST và tôi không có tài liệu 'after' trên một cuộc gọi tiếp theo. Tôi sẽ cần một cái gì đó như 'tìm kiếm (truy vấn, từ, kích thước, sắp xếp)'. Không phải 'TopScopeDocC ...', 'TopFieldC ...' không phải 'searchAfter' sẽ làm, thật không may. Tùy chọn duy nhất tôi thấy là nhận tất cả 'ScoreDocs' và thực hiện phân trang theo cách thủ công. –