5.索引库的维护
前言:本文是衔接上一篇文章来写的,详情看上一篇 【Lucene】实现全文索引
索引库的维护不外乎 增、删、改,下面就一一介绍下
5.1.索引库的添加
5.1.1.Field 域的属性
- 是否分析: 是否对域的内容进行分词处理。前提是我们要对域的内容进行查询。
- 是否索引: 将Field分析后的词或整个Field值进行索引,只有索引方可搜索到。
比如:商品名称、商品简介分析后进行索引,订单号、身份证号不用分析但也要索引,这些将来都要作为查询条件。 - 是否存储: 将Field值存储在文档中,存储在文档中的Field才可以从Document中获取
比如:商品名称、订单号,凡是将来要从Document中获取的Field都要存储。
是否存储的标准:是否要将内容展示给用户
下面的表格展示了比较常用的 Field ,同学们可以一一进行测试,我这里就不赘述了。
Field类 | 数据类型 | Analyzed是否分析 | Indexed是否索引 | Stored是否存储 | 说明 |
---|---|---|---|---|---|
StringField(FieldName, FieldValue,Store.YES)) | 字符串 | N | Y | Y或N | 这个Field用来构建一个字符串Field,但是不会进行分析,会将整个串存储在索引中,比如(订单号,姓名等) ,是否存储在文档中用Store.YES或Store.NO决定 |
LongPoint(String name, long… point) | Long型 | Y | Y | N | 可以使用LongPoint、IntPoint等类型存储数值类型的数据。让数值类型可以进行索引。但是不能存储数据,如果想存储数据还需要使用StoredField。 |
StoredField(FieldName, FieldValue) | 重载方法,支持多种类型 | N | N | Y | 这个Field用来构建不同类型Field,不分析,不索引,但要Field存储在文档中 |
TextField(FieldName, FieldValue, Store.NO)或TextField(FieldName, reader) | 字符串或流 | Y | Y | Y或N | 如果是一个Reader, lucene猜测内容比较多,会采用Unstored的策略. |
5.1.2.索引库的添加代码实现
其实上一篇文章里面我们在测试中文分词的时候添加过一遍了,下面我们再来写一次,也来利用一下 其他的 Field。
@Test
public void addDocument() throws Exception {
// 创建一个 IndexWriter 对象,需要使用 IKAnalyzer 作为分析器
Directory directory = FSDirectory.open(new File("D:\\IDEA1\\lelucene\\index").toPath());
// 创建一个 IndexWriter 对象,需要使用 IKAnalyzer 作为分析器
IndexWriterConfig indexWriterConfig = new IndexWriterConfig(new IKAnalyzer());
IndexWriter writer = new IndexWriter(directory, indexWriterConfig);
// 创建一个 document 对象
Document document = new Document();
// 向 document 对象添加域
document.add(new TextField("name", "新添加的文件", Field.Store.YES));
document.add(new TextField("content", "新添加的文件内容", Field.Store.NO));
// LongPoint创建索引
document.add(new LongPoint("size", 1000l));
//StoreField存储数据
document.add(new StoredField("size", 1000l));
//不需要创建索引的就使用StoreField存储
document.add(new StoredField("path", "d:/temp/1.txt"));
// 把文档添写入索引库
writer.addDocument(document);
// 关闭索引库
writer.close();
}
5.2.索引库删除
5.2.1.删除全部
我在这个测试类里面把创建 IndexWriter 对象抽取出来了, 这样就不用每次都写重复代码了,下面所有代码都在此基础上写的。
private IndexWriter IndexWriter;
@Before
public void init() throws Exception {
Directory directory = FSDirectory.open(new File("D:\\IDEA1\\lelucene\\index").toPath());
// 创建一个 IndexWriter 对象,需要使用 IKAnalyzer 作为分析器
IndexWriterConfig indexWriterConfig = new IndexWriterConfig(new IKAnalyzer());
indexWriter = new IndexWriter(directory, indexWriterConfig);
}
下面就直接使用 IndexWriter,删除所有。
@Test
public void testDeleteAllIndex() throws Exception {
// 删除所有 索引
indexWriter.deleteAll();
// 关闭
indexWriter.close();
}
注意: 此方法慎用!!!,会将索引目录的索引信息全部删除,直接彻底删除,无法恢复。
5.2.2.指定查询条件删除
这里其实是先查,然后再删
@Test
public void deleteDocumentByQuery() throws Exception {
// 删除 name 域里面所有 apache
indexWriter.deleteDocuments(new Term("name", "apache"));
indexWriter.close();
}
5.3.索引库的修改
修改的原理就是先删除然后再添加
@Test
public void updateDocument() throws Exception {
// 创建一个新的文档对象
Document document = new Document();
// 向document 对象中添加域
// 不同的document可以有不同的域,同一个document可以有相同的域。
document.add(new TextField("name", "更新之后的文档", Field.Store.YES));
document.add(new TextField("name1", "更新之后的文档2", Field.Store.YES));
document.add(new TextField("name2", "更新之后的文档3", Field.Store.YES));
// 更新操作
indexWriter.updateDocument(new Term("name", "spring"), document);
// 关闭索引库
indexWriter.close();
}
希望对你有帮助哦,下一篇介绍,Lucene 索引库的查询。
【Lucene】系列文章
【Lucene】全文检索技术介绍
【Lucene】实现全文检索
【Lucene】索引库的维护
【Lucene】索引库的查询