Lucene3.5自学系列3-索引的操作-IndexReader

在Lucene3.5中,对索引操作主要是IndexReader类控制,现在写个实例(基本操作都包括了),但是有些东西在3.5中已经过时了,具体现在不详说---------

这几天我发布都是带代码的实例,明白会写个总结,包括3.5中部分的概念,以及过时的方法的替换都将详述等东西。

//目前这几篇文章不适合初学者入门看,需要有点概要基础的能看懂,写在这儿只是给自己一个存档,没有专门为大家而写,请原谅,有时间会写个总结性东西,大家参考着并结合API,应该能理解的/

好了下面是今天的学习的

  1 package cn.swust.lucene;
2 import java.io.File;
3 import java.io.IOException;
4
5 import org.apache.lucene.analysis.Analyzer;
6 import org.apache.lucene.analysis.standard.StandardAnalyzer;
7 import org.apache.lucene.index.CorruptIndexException;
8 import org.apache.lucene.index.IndexReader;
9 import org.apache.lucene.index.IndexWriter;
10 import org.apache.lucene.index.IndexWriterConfig;
11 import org.apache.lucene.index.IndexWriterConfig.OpenMode;
12 import org.apache.lucene.index.Term;
13 import org.apache.lucene.store.Directory;
14 import org.apache.lucene.store.FSDirectory;
15 import org.apache.lucene.store.LockObtainFailedException;
16 import org.apache.lucene.util.Version;
17
18
19 public class IndexReaderProcess {
20 private static String INDEX_SORT_PATH;
21 public IndexReaderProcess(String index_sort_path)
22 {
23 this.INDEX_SORT_PATH = index_sort_path;
24 }
25
26 /**
27 * 从索引中删除文档,分别根据编号删除(一次只能删除一个),和根据 词汇批量删除 ;该方法相当于将文档移到回收站,并未真正
28 * 删除,要恢复可以调用下面的undelete()方法。要真正从物理删除,还需要调用下面的forceDelete()方法
29 * @param id //文档编号
30 * @param keyWord
31 * @param flag true 表示通过ID删除 false表示根据词汇删除
32 * @throws CorruptIndexException
33 * @throws IOException
34 */
35 public synchronized void deleteDocumentByReader(int id,String keyWord,boolean flag) throws CorruptIndexException, IOException
36 {
37 System.out.println("删除前索引的信息");
38 readerIndex();
39 if(flag){
40 //根据document编号删除索引
41 IndexReader deleteById = IndexReader.open(FSDirectory.open(new File(INDEX_SORT_PATH)),false);
42 deleteById.deleteDocument(id);
43 deleteById.close();
44 }
45 //根据词汇批量删除
46 else{
47 IndexReader deleteByWord = IndexReader.open(FSDirectory.open(new File(INDEX_SORT_PATH)),false);
48 Term term = new Term("Content", keyWord);
49 deleteByWord.deleteDocuments(term);
50 deleteByWord.close();
51 }
52 System.out.println("删除后的索引信息");
53 readerIndex();
54 }
55 /**
56 * 通过IndexWriter 对索引文档进行批量删除操作,要恢复可以调用下面的undelete()方法。
57 * 要真正从物理删除,还需要调用下面的forceDelete()方法,
58 */
59 public synchronized void deleteDocumentByWriter(String keyWord)
60 {
61 Directory dir = null;
62 IndexWriter writer = null;
63 try {
64 dir = FSDirectory.open(new File(INDEX_SORT_PATH));
65 } catch (IOException e) {
66 e.printStackTrace();
67 }
68 Analyzer analyzer = new StandardAnalyzer(Version.LUCENE_35);
69 IndexWriterConfig iwc = new IndexWriterConfig(Version.LUCENE_35, analyzer);
70 iwc.setOpenMode(OpenMode.CREATE_OR_APPEND);
71 try {
72 writer = new IndexWriter(dir,iwc);
73 /**
74 * API中提供了下面几种删除方法,这里测试一种
75 * deleteAll() Delete all documents in the index.
76 * deleteDocuments(Query... queries)Deletes the document(s) matching any of the provided queries.
77 * deleteDocuments(Query query) Deletes the document(s) matching the provided query.
78 * deleteDocuments(Term... terms) Deletes the document(s) containing any of the terms.
79 * deleteDocuments(Term term) Deletes the document(s) containing term.
80 * deleteUnusedFiles()Expert: remove any index files that are no longer used.
81 */
82 writer.deleteDocuments(new Term("content", keyWord));
83 } catch (CorruptIndexException e) {
84 e.printStackTrace();
85 } catch (LockObtainFailedException e) {
86 e.printStackTrace();
87 } catch (IOException e) {
88 e.printStackTrace();
89 }finally{
90 try {
91 writer.close();
92 } catch (CorruptIndexException e) {
93 e.printStackTrace();
94 } catch (IOException e) {
95 e.printStackTrace();
96 }
97 }
98 }
99 //读取索引
100 public static void readerIndex()
101 {
102 IndexReader reader = null;
103 try {
104 reader = IndexReader.open(FSDirectory.open(new File(INDEX_SORT_PATH)));
105 System.out.println("索引版本为:"+reader.getVersion());
106 //打印文件数量
107 for (int i = 0; i < reader.numDocs(); i++) {
108 System.out.println(reader.document(i).get("FileName"));
109 }
110 reader.close();
111
112 } catch (CorruptIndexException e) {
113 e.printStackTrace();
114 } catch (IOException e) {
115 e.printStackTrace();
116 }
117 }
118 //对删除的索引文档进行恢复,前提是在调用没有forceDelete()
119 public static void undelete()
120 {
121 IndexReader undelete = null;
122 try {
123 undelete = IndexReader.open(FSDirectory.open(new File(INDEX_SORT_PATH)),false);
124 undelete.undeleteAll();
125 } catch (CorruptIndexException e) {
126 e.printStackTrace();
127 } catch (IOException e) {
128 e.printStackTrace();
129 }finally{
130 try {
131 undelete.close();
132 } catch (IOException e) {
133 e.printStackTrace();
134 }
135 }
136 }
137 //当删除了索引文档 ,通过此方法可以强制从物理文件上删除文档,强制优化,del文件就没了,回收站清空,并更新文档
138 public synchronized static void forceDelete()
139 {
140 Directory dir = null;
141 IndexWriter writer = null;
142 try {
143 dir = FSDirectory.open(new File(INDEX_SORT_PATH));
144 } catch (IOException e) {
145 e.printStackTrace();
146 }
147 Analyzer analyzer = new StandardAnalyzer(Version.LUCENE_35);
148 IndexWriterConfig iwc = new IndexWriterConfig(Version.LUCENE_35, analyzer);
149 iwc.setOpenMode(OpenMode.CREATE_OR_APPEND);
150 try {
151 writer = new IndexWriter(dir,iwc);
152 writer.forceMergeDeletes();//强制优化,del文件就没了,回收站清空
153 } catch (CorruptIndexException e) {
154 e.printStackTrace();
155 } catch (LockObtainFailedException e) {
156 e.printStackTrace();
157 } catch (IOException e) {
158 e.printStackTrace();
159 }finally{
160 try {
161 writer.close();
162 } catch (CorruptIndexException e) {
163 e.printStackTrace();
164 } catch (IOException e) {
165 e.printStackTrace();
166 }
167 }
168 }
169
170 }

/

//////////////////////////////////////////////////////////////////////
另外贴上前两天实例和今天实例的测试代码
 1 package cn.swust.lucene;
2
3 import java.io.IOException;
4
5 import org.apache.lucene.index.CorruptIndexException;
6 import org.apache.lucene.index.IndexReader;
7
8 public class LuceneTest {
9 public static void main(String[] args) {
10 String INDEX_SORT_PATH = "/home/qingfeideyi/文档/indexstore/";
11 /*建立索引
12 String inputPath = "/home/qingfeideyi/文档/lucene";
13 IndexProcessor ip = new IndexProcessor();
14 try {
15 ip.createIndex(inputPath);
16 } catch (IOException e) {
17 // TODO Auto-generated catch block
18 e.printStackTrace();
19 }
20 */
21 /*查询
22 Search search = new Search(INDEX_SORT_PATH);
23 String key = "www.hxsk.net";
24 search.indexSearch(key);
25 */
26 //IndexReader操作
27 IndexReaderProcess readerProcess = new IndexReaderProcess(INDEX_SORT_PATH);
28 String key = "www.hxsk.net";
29 /* //删除
30 try {
31 readerProcess.deleteDocumentByReader(0, key, false);
32 } catch (CorruptIndexException e) {
33 // TODO Auto-generated catch block
34 e.printStackTrace();
35 } catch (IOException e) {
36 // TODO Auto-generated catch block
37 e.printStackTrace();
38 }*/
39 //IndexReaderProcess.forceDelete();//强制彻底删除
40 //readerProcess.undelete();
41 IndexReaderProcess.readerIndex();
42 }
43 }




posted @ 2012-03-03 20:41  情非得已swust  阅读(1351)  评论(1)    收藏  举报