- Lucene 4 Cookbook
- Edwood Ng Vineeth Mohan
- 283字
- 2021-07-16 14:07:49
Enumerating results
We have already previewed how the results are enumerated from the previous sample code. You might have noticed that the major component in search results is TopDocs. Now, we will show you how to leverage this object to paginate results. Lucene does not provide pagination functionality, but we can still build pagination easily using what's available in TopDocs.
How to do it...
Here is a sample implementation on pagination:
public List<Document> getPage(int from , int size){ List<Document> documents = new ArraList<Document>(); Query query = parser.parse(searchTerm); TopDocs hits = searcher.search(query, maxNumberOfResults); int end = Math.min(hits.totalHits, size); for (int i = from; i < end; i++) { int docId = hits.scoreDocs[i].doc; //load the document Document doc = searcher.doc(docId); documents.add(doc); } return documents; }
How it works…
When we perform search in Lucene, actual results are not preloaded immediately. In TopDocs, we only get back an array of ranked pointers. It's called ranked pointers because they are not actual documents, but a list of references (DocId). By default, results are scored by the scoring mechanism. We will see more about scoring in detail in Introduction section Chapter 7, Flexible Scoring. For paging, we can calculate position offset, apply pagination ourselves, and leverage something like what we showed in the sample code to return results by page. Developers at Lucene actually recommend re-executing a search on every page, instead of storing the initial search results (refer to http://wiki.apache.org/lucene-java/LuceneFAQ#How_do_I_implement_paging.2C_i.e._showing_result_from_1-10.2C_11-20_etc.3F). The reasoning is that people are usually only interested in top results and they are confident in Lucene's performance.
Note
This code assumes that parser (QueryParser), searcher (IndexSearcher), and maxNumberOfResults
are already initialized. Note that this sample is for illustrative purpose only and it's not optimized.
- Mastering Concurrency Programming with Java 8
- Practical Data Analysis Cookbook
- GAE編程指南
- 軟件項目估算
- Getting started with Google Guava
- Learn to Create WordPress Themes by Building 5 Projects
- Responsive Web Design with HTML5 and CSS3
- oreilly精品圖書:軟件開發者路線圖叢書(共8冊)
- Mastering PHP Design Patterns
- Mastering OpenCV 4
- Linux命令行與shell腳本編程大全(第4版)
- Teaching with Google Classroom
- 硅谷Python工程師面試指南:數據結構、算法與系統設計
- Struts 2.x權威指南
- Modernizing Legacy Applications in PHP