Lucene 入门 04 - 全文检索查询的代码实现
2020-01-15 本文已影响0人
__Y_Q
上一章说的是索引库的创建, 这章来实现查询, 查询上章创建的索引.
查询一般分为以下几个步骤
- 创建一个 Directory 对象, 指定要查询的索引库的位置
- 创建一个 IndexReader 对象, (创建索引库的时候, 对象是 IndexWriter ), 需要指定 Directory 对象
- 创建一个 IndexSearch 查询对象, 需要指定 IndexReader.
- 创建一个 TermQuery 对象, 指定查询的域和要查询的关键词.
- 执行查询
- 返回查询结果, 遍历查询结果并输出
- 关闭 IndexReader 对象.
下面就让我们用代码来实现一个简单的索引库的查询
@Test
public void searchIndex(String fid, String text) throws Exception {
//1.创建一个 Director 对象, 指定索引库保存的位置
Directory mDirectory = FSDirectory.open(new File("/Users/yzhang/Desktop/Director").toPath());
//2. 创建一个 indexReader 对象
IndexReader indexReader = DirectoryReader.open(mDirectory);
//3.创建 IndexSearcher 查询对象
IndexSearcher indexSearcher = new IndexSearcher(indexReader);
//4. 创建一个 Query 对象, TermQuery 关键词查询, 找到 name 域中, 包含 spring 关键词的文档
//name 是上一章中,我们创建索引库的时候添加的 Field.
Query query = new TermQuery(new Term("name", "spring"));
//5. 执行查询, 得到一个 TopDocs 对象, 10 是指查询结果返回的最大记录数
//意思是,有 100 条的话, 就拿 10 条.
TopDocs topDocs = indexSearcher.search(query, 10);
System.out.println("总记录数:" + topDocs.totalHits);
//6. 获取返回结果, 取文档列表
ScoreDoc[] scoreDocs = topDocs.scoreDocs;
//打印文档中的内容
for (ScoreDoc scoreDoc : scoreDocs) {
//取文档 ID
int docID = scoreDoc.doc;
//根据文档 ID 取文档对象
Document document = indexSearcher.doc(docID);
System.out.println("name:" + document.get("name"));
System.out.println("path:" + document.get("path"));
//这里就不输出内容了, 不然等下截图的时候, 图片太大,
//System.out.println("content:" + document.get("content"));
System.out.println("size:" + document.get("size"));
System.out.println("\n--------------------------------------------------------\n");
}
//关闭 IndexReader 对象
indexReader.close();
}
![](https://img.haomeiwen.com/i7115372/27228b2269c7e3ab.png)
这是最基本的查询, 后面会说到一些别的查询. 基本的查询到此为止, 下一章是分析器的基本使用.