一、 获取搜索的关键字
获取用户输入的内容,假如我们要搜索文档中 title 字段包含 “组件” 这个词的记录。
二、 根据传入的字段和关键字进行组装搜索语法
TermQuery:
单字段搜索,精确查询,搜索的内容不会分词,"组件"、"刷新 " 可以查询到数据,“组件刷新” 查询不到。
new TermQuery(new Term("title", title)
三、 根据搜索语法到索引中查询得到索引指向的文档编号
创建一个查询对象,然后传入搜索条件,搜索返回TopDocs。
TopDocs存储的是根据关键字查询出来的文档编号列表,我们可指定查询的数量。
// 创建一个索引查询对象
DirectoryReader reader = DirectoryReader.open(fsd);
IndexSearcher searcher = new IndexSearcher(reader);
// 传入查询条件,指定查询10条记录
TopDocs docs = searcher.search(new TermQuery(new Term("title", title)), 10);
四、 根据文档编号的信息查询出文档数据对象
我们查询到文档的编号以后,我就就可以根据编号来获取文档对象了;
TopDocs.totalHits 表示符合条件的数据量。
TopDocs.scoreDocs 表示查询到的文档索引对象,里面的doc属性就表示文档的编号集合。
我们得到文档的编号后就可以使用IndexSearcher的doc方法获取到文档了。
for (ScoreDoc doc : docs.scoreDocs) {
Document document = searcher.doc(doc.doc);
System.out.println(document.get("title"));
}
附录:完整代码
@Test
public void termQuery() {
// lucene索引目录位置
String indexDir = "E:\develop\demo\lucene-learn\lucene-index";
File luceneIndexDirectory = new File(indexDir);
String title = "组件";
// 打开索引目录
try (FSDirectory fsd = FSDirectory.open(luceneIndexDirectory.toPath())) {
// 创建一个索引查询对象
DirectoryReader reader = DirectoryReader.open(fsd);
IndexSearcher searcher = new IndexSearcher(reader);
// 单字段搜索,单关键字精确查询
// 组件、刷新 可以查询到数据,组件刷新 查询不到
TopDocs docs = searcher.search(new TermQuery(new Term("title", title)), 10);
// 打印
for (ScoreDoc doc : docs.scoreDocs) {
Document document = searcher.doc(doc.doc);
System.out.println(document.get("title"));
}
// 关闭查询Reader
reader.close();
} catch (IOException e) {
System.err.println("打开索引目录失败");
e.printStackTrace();
}
}