到这步应该明白以下几个问题
lucene实现全文检索的流程
文档对象里面封装的域信息,几种子类域(查文档会用)
分词是为什么,怎么分,什么是语汇单元,
索引是怎么创建的,索引与语汇单元,与文档对象之间的关系,
能成功运行入门代码,能明白入门代码实现了的功能。
这篇主要回顾入门代码,介绍代码。提出需求问题。进一步实现场景一。
创建索引:
/**
* 创建IndexWriter(创建索引准备工作)
*/
private IndexWriter createIndexWriter(String indexRepositoryPath) throws Exception {
// 创建Directory对象
Directory dir = FSDirectory.open(new File(indexRepositoryPath));
// 索引库还可以存放到内存中
// Directory directory = new RAMDirectory();
// 创建一个标准分析器
Analyzer analyzer = new StandardAnalyzer();
// 创建IndexWriterConfig对象
// 参数1: Lucene的版本信息
// 参数2: 分析器对象
IndexWriterConfig config = new IndexWriterConfig(Version.LATEST, analyzer);
// 创建IndexWriter对象
return new IndexWriter(dir, config);
}
public void testCreateIndex() throws Exception {
// 第一步:创建IndexWriter(索引存放的位置)
// 类似IO中的写,将索引写进指定目录下
IndexWriter indexWriter = createIndexWriter("G:\\a\\v");
// 第二步:开始创建索引
// 采集原始数据(从指定的目录下取得文件对象列表集合)
File f = new File("G:\\a\\新建文件夹");
// 遍历文件对象列表
for (File file : f.listFiles()) {
//为每一个文档创建文档对象
Document document = new Document();
// 文件名称
String file_name = file.getName();
// 文件大小
long file_size = FileUtils.sizeOf(file);
// 文件路径
String file_path = file.getPath();
// 文件内容
String file_content = FileUtils.readFileToString(file);
//将以上的文档信息,封装到域中
// 第一个域,名字,fileName,查看子类域表(域的再学习),索引,分词都已经实现,
//是否储存,指定为储存
Field fileNameField = new TextField("fileName", file_name, Store.YES);
//第二个域:名字,fileSize,使用的是LongField域,查表看默认实现了什么,我们指定为储存,
Field fileSizeField = new LongField("fileSize", file_size, Store.YES);
//第三个域,存放的是 filepath,路径存放的内容,没有分词,没有索引,储存了。
Field filePathField = new StoredField("filePath", file_path);
//第四域。存放的是:内容,分词,索引了,但是我们没有储存,(使用的是No。)
Field fileContentField = new TextField("fileContent", file_content, Store.NO);
document.add(fileNameField);
document.add(fileSizeField);
document.add(filePathField);
document.add(fileContentField);
//将每个文档扔进索引库(自动为文档建立了索引)
indexWriter.addDocument(document);
}
indexWriter.close();
}
运行成功:即创建索引成功
查询,就没有说的了,查询就是去读索引库,然后根据索引找到语汇单元,找到文档
TermQuery query = new TermQuery(new Term("filename", "spring.txt"));
//执行查询(参数1:查询条件对象,参数2:查询结果返回的最大值)
TopDocs topDocs = searcher.search(query, 10);
上面两个代码就是执行查询的操作,第二句代码,返回的10,意思就是返回默认排序的前10个。
引出两个问题:
1:是怎么排序的?
2:我们只是能够搜索这个spring.txt文档,怎么实现搜索“全文”,搜索到“全文检索.txt