Lucene
获得文档
- 原始文档:要基于原始文档的数据内容建立索引
- 搜索引擎:使用爬虫获得原始文档
- 站内搜索:数据库内的数据查询
构建文档对象
- 对应每个文件创建document对象
- 每个document对象都包含多个域(field)
- 域中保存就是原始文档的数据,域包括名称和数据。
- 每一个文档都包含一个编号ID
分析文档
- 分词:根据空格进行拆分句子,得到单词的列表
- 把单词转为小写
- 去掉标点符号
- 去掉一些停用词(the a等)
- 每个关键词都封装到一个Term对象当中,Term中包含两部分,关键词所在的域和关键词本身。不同域里面拆分出来的程序是不一样的因为域的名称是不同的,比如文件名内部拆分的关键词域名是文件名,文件路径中的域名是路径名。
创建索引
- 基于关键词创建索引关系
- 索引库中包含
- 关键词列表
- Document文档
- 对应关系(一个关键词对应一个链表,从链表中获取到文章ID)
- 倒排索引:通过词语找文章
查询索引
用户查询接口
- 用户输入查询条件的地方
关键词封装为查询对象
- 要查询的域:指定某个域
- 要搜索的关键词
执行查询
- 根据关键词到相应的域上面进行搜索
- 找到关键词,根据关键词找到对应的文档
渲染结果
- 根据文档的ID找到文档对象
- 将搜索结果反馈给用户,例如highlight
实际操作
创建索引库步骤:
- 设置一个director对象,指定索引库保存的位置
- 基于Directory对象创建一个IndexWriter对象
- 读取磁盘上的文件,对应每个文件构建一个文档对象
- 向文档对象中添加域
- 关闭IndexWriter对象
public class Lucene {
//1. 设置一个director对象,指定索引库保存的位置
//可以指定索引保存在内存或是磁盘当中
Directory direct = FSDirectory.open(new File("PATH").toPath());
//2. 基于Directory对象创建一个IndexWriter对象
IndexWriter indexw = new IndexWriter(direct, new IndexWriterConfig());
//3. 读取磁盘上的文件,对应每个文件构建一个文档对象
File dir = new File("PATHNAME");
File[] files = dir.ListFiles();
for (File f :
files) {
//取文件名
String fileName = f.getName();
//文件的路径
String filePath = f.getPath();
//文件的内容
String fileContent = FileUtils.readFileToString(f, "utf-8");
//文件的大小
long fileSize = FileUtils.sizeOf(f);
//创建Field
//参数1:域的名称,参数2:域的内容,参数3:是否存储
Field fieldName = new TextField("name", fileName, Field.Store.YES);
//Field fieldPath = new TextField("path", filePath, Field.Store.YES);
Field fieldPath = new StoredField("path", filePath);
Field fieldContent = new TextField("content", fileContent, Field.Store.YES);
//Field fieldSize = new TextField("size", fileSize + "", Field.Store.YES);
Field fieldSizeValue = new LongPoint("size", fileSize);
Field fieldSizeStore = new StoredField("size", fileSize);
//创建文档对象
Document document = new Document();
//向文档对象中添加域
document.add(fieldName);
document.add(fieldPath);
document.add(fieldContent);
//document.add(fieldSize);
document.add(fieldSizeValue);
document.add(fieldSizeStore);
//5、把文档对象写入索引库
indexWriter.addDocument(document);
}
//6、关闭indexwriter对象
indexWriter.close();
//4. 向文档对象中添加域
//5. 关闭IndexWriter对象
}
Store.YES 保存 可以查询 可以打印内容
Field storeYes = new Field(“storeyes”,“storeyes”,Store.YES,Index.TOKENIZED);
Store.NO 不保存 可以查询 不可打印内容 由于不保存内容所以节省空间,但是这个索引是存在的,可以通过这个索引去检索
Field storeNo = new Field(“storeno”,“storeno”,Store.NO,Index.TOKENIZED);