个人的博客小站已经上线了,网址 链接地址,欢迎大家来吐槽~
上一篇博客已经介绍了实时索引的检索功能,这个就相当于数据的的查询功能,我们都知道数据库的增删改查是最常用的四个功能,实时索引也是一样,他也有增删改查操作,这里就介绍一下实时索引的增删改操作,在实时索引管理类的那篇博客中,我们已经提到实时索引中的IndexWriter的操作都是委托给TrackingIndexWriter来操作的,TrackingIndexWriter中的方法和IndexWriter中的方法类似,都实现了索引的基本操作,下面就一一介绍下。
索引名就可以将我实例化
这里的NRTIndex和之前的NRTSearch类一样,都是根据索引名来实例化,在NRTIndex类中,我们定义两个属性,一个是TrackingIndexWriter对象,一个是索引名。因此NRTIndex的构造方法如下:
1
2
3
4
5 1public NRTIndex(String indexName){
2 this.indexName = indexName;
3 indexWriter = IndexManager.getIndexManager(indexName).getTrackingIndexWriter();
4}
5
1
2 1 **操作一条语句足够**
2
TrackingIndexWriter中的操作和IndexWriter一样简单,几乎都是一条语句足够了,下面我们分别看下增删改的操作语句:
1
2
3
4
5
6
7
8
9 1//新增一条记录
2indexWriter.addDocument(doc);
3//删除符合条件的记录
4indexWriter.deleteDocuments(query);
5//所有的记录都不要了
6indexWriter.deleteAll();
7//按照条件更新记录
8indexWriter.updateDocument(term, doc);
9
1
2 1 代码的实现就是如此简单,简简单单的一条语句就实现了索引的操作,当然这一切都要感谢Lucene的强大功能。
2
我很懒的
为了方便后面的操作,我们将这四个方法进行进一步的封装,使后续操作更加简单,NRTIndex类的源码如下:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99 1/**
2 *@Description: 索引管理操作类,增删改三种操作
3 */
4package com.lulei.lucene.index.operation;
5
6import java.io.IOException;
7
8import org.apache.lucene.document.Document;
9import org.apache.lucene.index.Term;
10import org.apache.lucene.search.NRTManager.TrackingIndexWriter;
11import org.apache.lucene.search.Query;
12
13import com.lulei.lucene.index.manager.IndexManager;
14
15public class NRTIndex {
16
17 private TrackingIndexWriter indexWriter;
18 private String indexName;
19
20 //直接使用IndexManager中的indexWriter,将索引的修改操作委托给TrackingIndexWriter实现
21 public NRTIndex(String indexName){
22 this.indexName = indexName;
23 indexWriter = IndexManager.getIndexManager(indexName).getTrackingIndexWriter();
24 }
25
26 /**
27 * @param doc
28 * @return boolean
29 * @Author: lulei
30 * @Description: 增加Document至索引
31 */
32 public boolean addDocument(Document doc){
33 try {
34 indexWriter.addDocument(doc);
35 return true;
36 } catch (IOException e){
37 e.printStackTrace();
38 return false;
39 }
40 }
41
42 /**
43 * @param query
44 * @return boolean
45 * @Author: lulei
46 * @Description: 按照Query条件从索引中删除Document
47 */
48 public boolean deleteDocument(Query query){
49 try {
50 indexWriter.deleteDocuments(query);
51 return true;
52 } catch (IOException e) {
53 e.printStackTrace();
54 return false;
55 }
56 }
57
58 /**
59 * @return
60 * @Author: lulei
61 * @Description: 清空索引
62 */
63 public boolean deleteAll(){
64 try {
65 indexWriter.deleteAll();
66 return true;
67 } catch (IOException e) {
68 e.printStackTrace();
69 return false;
70 }
71 }
72
73 /**
74 * @param term
75 * @param doc
76 * @return
77 * @Author: lulei
78 * @Description: 按照Term条件修改索引中Document
79 */
80 public boolean updateDocument(Term term, Document doc){
81 try {
82 indexWriter.updateDocument(term, doc);
83 return true;
84 } catch (IOException e) {
85 e.printStackTrace();
86 return false;
87 }
88 }
89
90 /**
91 * @throws IOException
92 * @Author:lulei
93 * @Description: 合并索引
94 */
95 public void commit() throws IOException {
96 IndexManager.getIndexManager(indexName).getIndexWriter().commit();
97 }
98}
99
这里的对NRTIndex类的介绍就结束了,后面博客会对NRTSearch和NRTIndex类创建应用子类,是索引的操作更加简单。
ps:最近发现其他网站可能会对博客转载,上面并没有源链接,如想查看更多关于 基于lucene的案例开发 请 http://www.aiuxian.com/catalog/p-322798.html。或访问网址http://blog.csdn.net/xiaojimanman/article/category/2841877 或 http://https://www.daimajiaoliu.com/series/lucene_basic/www.llwjy.com/