【Lucene】索引库的维护

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))字符串NYY或N这个Field用来构建一个字符串Field,但是不会进行分析,会将整个串存储在索引中,比如(订单号,姓名等) ,是否存储在文档中用Store.YES或Store.NO决定
LongPoint(String name, long… point)Long型YYN可以使用LongPoint、IntPoint等类型存储数值类型的数据。让数值类型可以进行索引。但是不能存储数据,如果想存储数据还需要使用StoredField。
StoredField(FieldName, FieldValue)重载方法,支持多种类型NNY这个Field用来构建不同类型Field,不分析,不索引,但要Field存储在文档中
TextField(FieldName, FieldValue, Store.NO)或TextField(FieldName, reader)字符串或流YYY或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】索引库的查询

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值