实现了对数据的索引建立后就需要实现通过索引对数据的检索功能了,同时大部分的检索往往要求实现数据分页显示,因此同时需要实现数据的分页功能。
实现查询首先要创建一个IndexSearcher对象,创建代码如下。
String indexDirectoryPath = "D:/code/";
Directory indexDirectory = FSDirectory.open(Paths.get(indexDirectoryPath));
IndexReader reader = DirectoryReader.open(directory);
IndexSearcher indexSearcher = new IndexSearcher(reader) ;
上面的代码中需要注意indexDirectoryPath中的地址需要和之前创建IndexWriter时使用的地址相同。通过创建的IndexSearcher我们就可以实现各种数据检索功能了,例如最简单的关键字检索功能,代码如下。
TermQuery query = new TermQuery(new Term("Title", "通知公告"));
BooleanQuery booleanQuery = new BooleanQuery.Builder().add(query, Occur.MUST).build();
TopDocs hits = indexSearcher.search(booleanQuery, 30);
for(ScoreDoc scoreDoc : hits.scoreDocs) {
Document doc = searcher.getDocument(scoreDoc);
System.out.println("File: " + doc.get("Title"));
}
上述代码中Title是之前创建的索引中包含的字段,在这里指定查询title中包含的“通知公告”相关内容的数据。同时最后将title中的数据打印出来,这里有个一个需要注意的,如果需要将title字段的内容能够在查询结果中获取需要在建立索引时将名称为title的field设置为Field.Store.YES,否则虽然可以对title进行查询,但是无法从查询的结果中获取到title的内容。
上面的例子中虽然实现了简单的关键字检索,但是lucene中的检索方式非常的多,而且操作方式比较繁琐,为了配合后面的分页检索我设计了一个LuceneQuery类,用于统一管理lucene的检索条件,最终在查询时可以通过这个类自动获取query对象来实现检索。LuceneQuery类代码如下:
package cn.izdigital.zwei.businesscomponent.lucene;
import java.util.Date;
import java.util.LinkedList;
import java.util.List;
import org.apache.lucene.analysis.Analyzer;
import org.apache.lucene.analysis.cn.smart.SmartChineseAnalyzer;
import org.apache.lucene.document.IntPoint;
import org.apache.lucene.document.LongPoint;
import org.apache.lucene.index.Term;
import org.apache.lucene.queryparser.classic.MultiFieldQueryParser;
import org.apache.luc