1 需求
管理人员通过电商系统更改图书信息,这时更新的是关系数据库,如果使用lucene搜索图书信息,需要在数据库表book信息变化时及时更新lucene索引库。
2 添加索引
调用 indexWriter.addDocument(doc)添加索引。
参考入门程序的创建索引。
3 修改索引
更新索引是先删除再添加,建议对更新需求采用此方法并且要保证对已存在的索引执行更新,可以先查询出来,确定更新记录存在执行更新操作。
如果更新索引的目标文档对象不存在,则执行添加。
代码:
/*** 索引库修改操作* @throws Exception*/@Testpublic void updateIndexTest() throws Exception {//需要变更成的内容Document document = new Document();document.add(new StringField("id", "100000003145", Field.Store.YES));document.add(new TextField("name", "xxxx", Field.Store.YES));document.add(new IntPoint("price", 123));document.add(new StoredField("price", 123));document.add(new StoredField("image", "xxxx.jpg"));document.add(new StringField("categoryName", "手机", Field.Store.YES));document.add(new StringField("brandName", "华为", Field.Store.YES));//3. 创建分词器, StandardAnalyzer标准分词器, 对英文分词效果好, 对中文是单字分词, 也就是一个字就认为是一个词.Analyzer analyzer = new StandardAnalyzer();//4. 创建Directory目录对象, 目录对象表示索引库的位置Directory dir = FSDirectory.open(Paths.get("E:\\dir"));//5. 创建IndexWriterConfig对象, 这个对象中指定切分词使用的分词器IndexWriterConfig config = new IndexWriterConfig(analyzer);//6. 创建IndexWriter输出流对象, 指定输出的位置和使用的config初始化对象IndexWriter indexWriter = new IndexWriter(dir, config);//修改, 第一个参数: 修改条件, 第二个参数: 修改成的内容indexWriter.updateDocument(new Term("id", "100000003145"), document);//8. 释放资源indexWriter.close();}
luke查看插入的结果
4 删除索引
4.1 删除指定索引
根据Term项删除索引,满足条件的将全部删除。
/*** 测试根据条件删除* @throws Exception*/@Testpublic void deleteIndexTest() throws Exception {//3. 创建分词器, StandardAnalyzer标准分词器, 对英文分词效果好, 对中文是单字分词, 也就是一个字就认为是一个词.Analyzer analyzer = new StandardAnalyzer();//4. 创建Directory目录对象, 目录对象表示索引库的位置Directory dir = FSDirectory.open(Paths.get("E:\\dir"));//5. 创建IndexWriterConfig对象, 这个对象中指定切分词使用的分词器IndexWriterConfig config = new IndexWriterConfig(analyzer);//6. 创建IndexWriter输出流对象, 指定输出的位置和使用的config初始化对象IndexWriter indexWriter = new IndexWriter(dir, config);//测试根据条件删除indexWriter.deleteDocuments(new Term("id", "100000003145"));//8. 释放资源indexWriter.close();}
效果如下图:索引域没有变化
文档域数据被删除掉
4.2 删除全部索引(慎用)
将索引目录的索引信息全部删除,直接彻底删除,无法恢复。
建议参照关系数据库基于主键删除方式,所以在创建索引时需要创建一个主键Field,删除时根据此主键Field删除。
索引删除后将放在Lucene的回收站中,Lucene3.X版本可以恢复删除的文档,3.X之后无法恢复。
代码:
/*** 测试根据条件删除* @throws Exception*/@Testpublic void deleteIndexTest() throws Exception {//3. 创建分词器, StandardAnalyzer标准分词器, 对英文分词效果好, 对中文是单字分词, 也就是一个字就认为是一个词.Analyzer analyzer = new StandardAnalyzer();//4. 创建Directory目录对象, 目录对象表示索引库的位置Directory dir = FSDirectory.open(Paths.get("E:\\dir"));//5. 创建IndexWriterConfig对象, 这个对象中指定切分词使用的分词器IndexWriterConfig config = new IndexWriterConfig(analyzer);//6. 创建IndexWriter输出流对象, 指定输出的位置和使用的config初始化对象IndexWriter indexWriter = new IndexWriter(dir, config);//测试删除所有内容indexWriter.deleteAll();//8. 释放资源indexWriter.close();}
索引域数据清空
文档域数据也清空