热门标签 | HotTags
当前位置:  开发笔记 > 编程语言 > 正文

*lucene索引_的删除和更新

【删除】【恢复删除】【强制删除】【优化和合并】【更新索引】附:代码:IndexUtil.java:1packagecn.hk.index;

【删除】

 

【恢复删除】

 

【强制删除】

 

【优化和合并】

 

【更新索引】

 

附:

 

代码:

IndexUtil.java:

1 package cn.hk.index;
2
3 import java.io.File;
4 import java.io.IOException;
5
6 import org.apache.lucene.analysis.standard.StandardAnalyzer;
7 import org.apache.lucene.document.Document;
8 import org.apache.lucene.document.Field;
9 import org.apache.lucene.index.CorruptIndexException;
10 import org.apache.lucene.index.IndexReader;
11 import org.apache.lucene.index.IndexWriter;
12 import org.apache.lucene.index.IndexWriterConfig;
13 import org.apache.lucene.index.StaleReaderException;
14 import org.apache.lucene.index.Term;
15 import org.apache.lucene.store.Directory;
16 import org.apache.lucene.store.FSDirectory;
17 import org.apache.lucene.store.LockObtainFailedException;
18 import org.apache.lucene.util.Version;
19
20 public class IndexUtil {
21 private String[] ids = {"1","2","3","4","5","6"};
22 private String[] emails = {"aa@hk.arg","bb@hk.org","cc@hk.arg",
23 "dd@hk.org","ee@hk.org","ff@hk.org"};
24 private String[] content = {
25 "welcome to visited the space","hello boy","my name is aa","i like football",
26 "I like football and I like Basketball too","I like movie and swim"
27 };
28 private int[] attachs = {2,3,1,4,5,5};
29 private String[] names = {"zhangsan","lisi","john","mike","jetty","jake"};
30
31 private Directory directory = null;
32
33 public IndexUtil(){
34 try {
35 directory = FSDirectory.open(new File("d://lucene/index02"));
36 } catch (IOException e) {
37 e.printStackTrace();
38 }
39 }
40
41 public void update(){
42 IndexWriter writer =null;
43 try {
44 writer = new IndexWriter(directory,
45 new IndexWriterConfig(Version.LUCENE_35,new StandardAnalyzer(Version.LUCENE_35)));
46 /*
47 * lucene并没有提供更新的方法,这里的更新其实是提供如下两个操作:
48 * 先删除之后再添加
49 */
50 Document doc = new Document();
51 doc.add(new Field("id","11",Field.Store.YES,Field.Index.NOT_ANALYZED_NO_NORMS));
52 doc.add(new Field("email",emails[0],Field.Store.YES,Field.Index.NOT_ANALYZED));
53 doc.add(new Field("content",content[0],Field.Store.NO,Field.Index.ANALYZED));
54 doc.add(new Field("name",names[0],Field.Store.YES,Field.Index.NOT_ANALYZED_NO_NORMS));
55 writer.updateDocument(new Term("id","1"),doc);
56 } catch (CorruptIndexException e) {
57 e.printStackTrace();
58 } catch (LockObtainFailedException e) {
59 e.printStackTrace();
60 } catch (IOException e) {
61 e.printStackTrace();
62 }finally{
63 if(writer != null)
64 try {
65 writer.close();
66 } catch (CorruptIndexException e) {
67 e.printStackTrace();
68 } catch (IOException e) {
69 e.printStackTrace();
70 }
71 }
72
73 }
74
75
76 public void merge(){
77 IndexWriter writer = null;
78 try {
79 writer = new IndexWriter(directory,
80 new IndexWriterConfig(Version.LUCENE_35, new StandardAnalyzer(Version.LUCENE_35)));
81 //会将索引合并为2段,这两段中的被删除的数据会被清空
82 //特别注意:此处在lucene3.5后不建议使用,因为会消耗大量的开销,
83 //lucene会根据情况自动处理的
84 writer.forceMerge(2);
85 } catch (CorruptIndexException e) {
86 e.printStackTrace();
87 } catch (LockObtainFailedException e) {
88 e.printStackTrace();
89 } catch (IOException e) {
90 e.printStackTrace();
91 }finally{
92 if(writer != null)
93 try {
94 writer.close();
95 } catch (CorruptIndexException e) {
96 e.printStackTrace();
97 } catch (IOException e) {
98 e.printStackTrace();
99 }
100 }
101 }
102
103 public void forceDelete(){
104 IndexWriter writer = null;
105 try {
106 writer = new IndexWriter(directory,
107 new IndexWriterConfig(Version.LUCENE_35,new StandardAnalyzer(Version.LUCENE_35)));
108 writer.forceMergeDeletes();
109 } catch (CorruptIndexException e) {
110 e.printStackTrace();
111 } catch (LockObtainFailedException e) {
112 e.printStackTrace();
113 } catch (IOException e) {
114 e.printStackTrace();
115 }finally{
116 if(writer != null)
117 try {
118 writer.close();
119 } catch (CorruptIndexException e) {
120 e.printStackTrace();
121 } catch (IOException e) {
122 e.printStackTrace();
123 }
124 }
125 }
126
127
128 public void undelete(){
129 //使用IndexReader进行恢复
130 try {
131 IndexReader reader = IndexReader.open(directory,false);
132 //回复时,必须把IndexReader的只读(readyonly)设置为FALSE
133 reader.undeleteAll();
134 reader.close();
135 } catch (StaleReaderException e) {
136
137 e.printStackTrace();
138 } catch (CorruptIndexException e) {
139
140 e.printStackTrace();
141 } catch (LockObtainFailedException e) {
142
143 e.printStackTrace();
144 } catch (IOException e) {
145 // TODO Auto-generated catch block
146 e.printStackTrace();
147 }
148 }
149
150
151
152
153
154 public void delete(){
155 IndexWriter writer = null;
156 try {
157 writer = new IndexWriter(directory,
158 new IndexWriterConfig(Version.LUCENE_35, new StandardAnalyzer(Version.LUCENE_35)));
159 //删除ID为1的文档
160 //参数可以是一个选项,可以是一个Query,也可以是一个Term,Term是一个精确查找的值
161 //此时删除的文档并不会被完全删除,而是存储在回收站中的,可以恢复
162 writer.deleteDocuments(new Term("id","1"));
163 } catch (CorruptIndexException e) {
164
165 e.printStackTrace();
166 } catch (LockObtainFailedException e) {
167
168 e.printStackTrace();
169 } catch (IOException e) {
170
171 e.printStackTrace();
172 }finally{
173 if(writer != null)
174 try {
175 writer.close();
176 } catch (CorruptIndexException e) {
177
178 e.printStackTrace();
179 } catch (IOException e) {
180
181 e.printStackTrace();
182 }
183 }
184 }
185
186
187
188 public void query(){
189 try {
190 IndexReader reader = IndexReader.open(directory);
191 //通过reader可以获取文档的数量
192 System.out.println("numDocs:" + reader.numDocs());
193 System.out.println("maxDocs" + reader.maxDoc());
194 System.out.println("deleteDocs:" + reader.numDeletedDocs());
195 reader.close();
196 } catch (CorruptIndexException e) {
197
198 e.printStackTrace();
199 } catch (IOException e) {
200
201 e.printStackTrace();
202 }
203 }
204
205
206 public void index(){
207 IndexWriter writer = null;
208 try {
209 writer = new IndexWriter(directory,new IndexWriterConfig(Version.LUCENE_35, new StandardAnalyzer(Version.LUCENE_35)));
210 Document doc = null;
211 for(int i=0;i){
212 doc = new Document();
213 doc.add(new Field("id",ids[i],Field.Store.YES,Field.Index.NOT_ANALYZED_NO_NORMS));
214 doc.add(new Field("email",emails[i],Field.Store.YES,Field.Index.NOT_ANALYZED));
215 doc.add(new Field("content",content[i],Field.Store.NO,Field.Index.ANALYZED));
216 doc.add(new Field("name",names[i],Field.Store.YES,Field.Index.NOT_ANALYZED_NO_NORMS));
217 writer.addDocument(doc);
218 }
219 } catch (CorruptIndexException e) {
220 e.printStackTrace();
221 } catch (LockObtainFailedException e) {
222 e.printStackTrace();
223 } catch (IOException e) {
224 e.printStackTrace();
225 }finally{
226 if(writer != null)
227 try {
228 writer.close();
229 } catch (CorruptIndexException e) {
230
231 e.printStackTrace();
232 } catch (IOException e) {
233
234 e.printStackTrace();
235 }
236
237 }
238 }
239
240 }

 

TestIndex.java:

1 package cn.hk.test;
2
3 import org.junit.Test;
4
5 import cn.hk.index.IndexUtil;
6
7 public class TestIndex {
8
9 @Test
10 public void testIndex(){
11 IndexUtil iu = new IndexUtil();
12 iu.index();
13 }
14
15 @Test
16 public void testQuery(){
17 IndexUtil iu = new IndexUtil();
18 iu.query();
19 }
20
21 @Test
22 public void testDelete(){
23 IndexUtil iu = new IndexUtil();
24 iu.delete();
25 }
26
27 @Test
28 public void testUnDelete(){
29 IndexUtil iu = new IndexUtil();
30 iu.undelete();
31 }
32
33 @Test
34 public void testForceDelete(){
35 IndexUtil iu = new IndexUtil();
36 iu.forceDelete();
37 }
38
39 public void testMerge(){
40 IndexUtil iu = new IndexUtil();
41 iu.merge();
42 }
43
44 @Test
45 public void testUpdate(){
46 IndexUtil iu = new IndexUtil();
47 iu.update();
48 }
49 }

 

 

转:https://www.cnblogs.com/zhzcode/p/9887656.html



推荐阅读
  • 详解MyBatis二级缓存的启用与配置
    本文深入探讨了MyBatis二级缓存的启用方法及其配置细节,通过具体的代码实例进行说明,有助于开发者更好地理解和应用这一特性,提升应用程序的性能。 ... [详细]
  • 深入解析Android Activity生命周期
    本文详细探讨了Android中Activity的生命周期,通过实例代码和详细的步骤说明,帮助开发者更好地理解和掌握Activity各个阶段的行为。 ... [详细]
  • Java实现实时更新的日期与时间显示
    本文介绍了如何使用Java编程语言来创建一个能够实时更新显示系统当前日期和时间的小程序。通过使用Swing库中的组件和定时器功能,可以实现界面友好且功能强大的时间显示应用。 ... [详细]
  • SQLite是一种轻量级的关系型数据库管理系统,尽管体积小巧,却能支持高达2TB的数据库容量,每个数据库以单个文件形式存储。本文将详细介绍SQLite在Android开发中的应用,包括其数据存储机制、事务处理方式及数据类型的动态特性。 ... [详细]
  • 本文详细解析了Java中流的概念,特别是OutputStream和InputStream的区别,并通过实际案例介绍了如何实现Java对象的序列化。文章不仅解释了流的基本概念,还探讨了序列化的重要性和具体实现步骤。 ... [详细]
  • 本文探讨了Java中有效停止线程的多种方法,包括使用标志位、中断机制及处理阻塞I/O操作等,旨在帮助开发者避免使用已废弃的危险方法,确保线程安全和程序稳定性。 ... [详细]
  • 第1章选择流程控制语句1.1顺序结构的基本使用1.1.1顺序结构概述是程序中最简单最基本的流程控制,没有特定的语法结构,按照代码的先后顺序,依次执行,程序中大多数的代码都是这样执行 ... [详细]
  • Mac环境下Java与Ant自动化构建环境搭建指南
    本文详细介绍了如何在Mac操作系统上为测试工程师搭建Java和Ant开发环境,包括环境变量配置等关键步骤。 ... [详细]
  • 本文介绍了如何在Spring框架中配置和使用定时任务,包括初始化配置和动态启动定时器的方法。通过示例代码展示了如何利用Spring的TaskScheduler接口来创建和管理定时任务。 ... [详细]
  • Python:新浪微博API初试
    {想在微博上抓点数据进行分析,费了一天多的时间,才终于找到点头绪,整理一下。}目录:一注册创建应用获取认证和授权二新浪微博pythonsdk下载和安装三简 ... [详细]
  • electronvue使用electronupdater实现自动更新
    今天呢,给大家带来一篇干货满满的electron-vue自动升级的教程,话不多说,开始我的表演!配置文件package.jsonbu ... [详细]
  • 本文介绍了JSP的基本概念、常用标签及其功能,并通过示例详细说明了如何在JSP页面中使用Java代码。 ... [详细]
  • 本教程旨在指导开发者如何在Android应用中通过ViewPager组件实现图片轮播功能,适用于初学者和有一定经验的开发者,帮助提升应用的视觉吸引力。 ... [详细]
  • 本文详细介绍了Spring AOP注解的基本概念及其实现方式,并通过实例演示了如何在项目中使用这些注解进行面向切面的编程。旨在帮助开发者更好地理解和运用Spring AOP功能。 ... [详细]
  • 本文详细介绍了如何使用 Python 编程语言中的 Scapy 库执行 DNS 欺骗攻击,包括必要的软件安装、攻击流程及代码示例。 ... [详细]
author-avatar
书友79086887
这个家伙很懒,什么也没留下!
PHP1.CN | 中国最专业的PHP中文社区 | DevBox开发工具箱 | json解析格式化 |PHP资讯 | PHP教程 | 数据库技术 | 服务器技术 | 前端开发技术 | PHP框架 | 开发工具 | 在线工具
Copyright © 1998 - 2020 PHP1.CN. All Rights Reserved | 京公网安备 11010802041100号 | 京ICP备19059560号-4 | PHP1.CN 第一PHP社区 版权所有