Solrj是Solr搜索服务器的一个比较基础的客户端工具,可以非常方便地与Solr搜索服务器进行交互。最基本的功能就是管理Solr索引,包括添加、更新、删除和查询等。对于一些比较基础的应用,用Solj基本够用,而且你可以非常容易地通过使用Solrj的API实现与Solr搜索服务器进行交互,实现对Solr的基本管理功能。如果你的应用比较复杂,可以扩展Solrj来满足需要。
Solrj是Solr搜索服务器的一个比较基础的客户端工具,可以非常方便地与Solr搜索服务器进行交互。最基本的功能就是管理Solr索引,包括添加、更新、删除和查询等。对于一些比较基础的应用,用Solj基本够用,而且你可以非常容易地通过使用Solrj的API实现与Solr搜索服务器进行交互,实现对Solr的基本管理功能。如果你的应用比较复杂,可以扩展Solrj来满足需要。
使用 SolrJ操作索引库:
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
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
197
198
199
200
201
202
203
204
205
206
207
208
209
210
211
212
213
214
215
216
217
218
219
220
221
222
223
224
225
226
227
228
229
230
231
232
233
234
235
236
237
238
239
240
241
242
243
244
245
246
247
248
249
250
251
252
253
254
255
256
257
258
259
260
261
262
263
264
265
266
267
268
269
270
271
272
273
274
275
276
277
278
279
280
281
|
package
com.hcm.solr.test;
import
java.io.IOException;
import
java.util.ArrayList;
import
java.util.Iterator;
import
java.util.List;
import
java.util.Map;
import
org.apache.commons.logging.Log;
import
org.apache.commons.logging.LogFactory;
import
org.apache.solr.client.solrj.SolrQuery;
import
org.apache.solr.client.solrj.SolrServerException;
import
org.apache.solr.client.solrj.impl.HttpSolrServer;
import
org.apache.solr.client.solrj.response.QueryResponse;
import
org.apache.solr.client.solrj.response.UpdateResponse;
import
org.apache.solr.common.SolrDocument;
import
org.apache.solr.common.SolrDocumentList;
import
org.apache.solr.common.SolrInputDocument;
import
org.apache.solr.common.params.ModifiableSolrParams;
import
org.junit.Before;
import
org.junit.Test;
import
com.hcm.solr.entity.Message;
public
class
SolrTest {
private
static
Log logger = LogFactory.getLog(SolrTest.
class
);
private
static
final
String URL =
"http://127.0.0.1:8086/solr"
;
private
HttpSolrServer server =
null
;
@Before
public
void
init() {
// 创建 server
server =
new
HttpSolrServer(URL);
}
/**
* 添加文档
*/
@Test
public
void
addDoc() {
SolrInputDocument doc =
new
SolrInputDocument();
doc.addField(
"id"
,
"11"
);
doc.addField(
"title"
,
"this is my document !!"
);
try
{
UpdateResponse response = server.add(doc);
// 提交
server.commit();
logger.info(
"########## Query Time :"
+ response.getQTime());
logger.info(
"########## Elapsed Time :"
+ response.getElapsedTime());
logger.info(
"########## Status :"
+ response.getStatus());
}
catch
(SolrServerException | IOException e) {
logger.error(
""
, e);
}
}
/**
* 添加多个文档
*/
@Test
public
void
addDocs() {
String[] titles =
new
String[] {
"aaaaaaa"
,
"bbbbbbb"
,
"ccccccc"
,
"dddddd"
,
"eeeeee"
};
List<SolrInputDocument> docs =
new
ArrayList<SolrInputDocument>();
int
i =
0
;
for
(String str : titles) {
SolrInputDocument doc =
new
SolrInputDocument();
doc.addField(
"id"
, i++);
doc.addField(
"title"
, str);
docs.add(doc);
}
try
{
UpdateResponse response = server.add(docs);
server.commit();
logger.info(
"########## Query Time :"
+ response.getQTime());
logger.info(
"########## Elapsed Time :"
+ response.getElapsedTime());
logger.info(
"########## Status :"
+ response.getStatus());
}
catch
(SolrServerException | IOException e) {
logger.error(
""
, e);
}
}
/**
* 添加一个Entity到索引库
*/
@Test
public
void
addBean() {
Message msg =
new
Message(
"1001"
,
"What is Fluentd?"
,
new
String[] {
"Fluentd is an open source data collector for unified logging layer"
,
"Fluentd allows you to unify data collection and consumption for a better use and understanding of data."
,
"Fluentd decouples data sources from backend systems by providing a unified logging layer in between."
,
"Fluentd proves you can achieve programmer happiness and performance at the same time. A great example of Ruby beyond the Web."
,
"Fluentd to differentiate their products with better use of data."
});
try
{
UpdateResponse response = server.addBean(msg);
server.commit();
logger.info(
"########## Query Time :"
+ response.getQTime());
logger.info(
"########## Elapsed Time :"
+ response.getElapsedTime());
logger.info(
"########## Status :"
+ response.getStatus());
}
catch
(SolrServerException | IOException e) {
logger.error(
""
, e);
}
}
/**
* 添加多个Entity到索引库
*/
@Test
public
void
addBeans() {
List<Message> msgs =
new
ArrayList<Message>();
Message msg =
new
Message(
"1001"
,
"What is Fluentd?"
,
new
String[] {
"Fluentd is an open source data collector for unified logging layer"
,
"Fluentd allows you to unify data collection and consumption for a better use and understanding of data."
,
"Fluentd decouples data sources from backend systems by providing a unified logging layer in between."
,
"Fluentd proves you can achieve programmer happiness and performance at the same time. A great example of Ruby beyond the Web."
,
"Fluentd to differentiate their products with better use of data."
});
Message msg2 =
new
Message(
"1002"
,
"What is Fluentd?"
,
new
String[] {
"Fluentd is an open source data collector for unified logging layer"
,
"Fluentd allows you to unify data collection and consumption for a better use and understanding of data."
,
"Fluentd decouples data sources from backend systems by providing a unified logging layer in between."
,
"Fluentd proves you can achieve programmer happiness and performance at the same time. A great example of Ruby beyond the Web."
,
"Fluentd to differentiate their products with better use of data."
});
msgs.add(msg);
msgs.add(msg2);
try
{
UpdateResponse response = server.addBeans(msgs);
server.commit();
logger.info(
"########## Query Time :"
+ response.getQTime());
logger.info(
"########## Elapsed Time :"
+ response.getElapsedTime());
logger.info(
"########## Status :"
+ response.getStatus());
}
catch
(SolrServerException | IOException e) {
logger.error(
""
, e);
}
}
/**
* 删除索引
*/
@Test
public
void
deleteDoc() {
try
{
server.deleteById(
"0"
);
server.commit();
}
catch
(SolrServerException | IOException e) {
logger.error(
""
, e);
}
}
/**
* 更新索引<br>
* solr索引库不同于数据库,没有更新的功能。如果想更新,先通过id删除对应的文档,再添加新的文档。
*/
@Test
public
void
updateDoc() {
// ... ...
}
/**
* 查询
*/
@Test
public
void
testQuery() {
String queryStr =
"*:*"
;
SolrQuery params =
new
SolrQuery(queryStr);
params.set(
"rows"
,
10
);
try
{
QueryResponse response = server.query(params);
SolrDocumentList list = response.getResults();
logger.info(
"########### 总共 : "
+ list.getNumFound() +
"条记录"
);
for
(SolrDocument doc : list) {
logger.info(
"######### id : "
+ doc.get(
"id"
) +
" title : "
+ doc.get(
"title"
));
}
}
catch
(SolrServerException e) {
logger.error(
""
, e);
}
}
/**
* 简单查询(分页)
*/
@Test
public
void
querySimple() {
ModifiableSolrParams params =
new
ModifiableSolrParams();
params.set(
"q"
,
"this my"
);
params.set(
"q.op"
,
"and"
);
params.set(
"start"
,
0
);
params.set(
"rows"
,
5
);
params.set(
"fl"
,
"*,score"
);
try
{
QueryResponse response = server.query(params);
SolrDocumentList list = response.getResults();
logger.info(
"########### 总共 : "
+ list.getNumFound() +
"条记录"
);
for
(SolrDocument doc : list) {
logger.info(
"######### id : "
+ doc.get(
"id"
) +
" title : "
+ doc.get(
"title"
));
}
}
catch
(SolrServerException e) {
logger.error(
""
, e);
}
}
/**
* 查询(分页,高亮)
*/
@Test
public
void
queryCase() {
String queryStr =
"title:this"
;
SolrQuery params =
new
SolrQuery(queryStr);
params.set(
"start"
,
0
);
params.set(
"rows"
,
5
);
// 启用高亮组件, 设置高亮
params.setHighlight(
true
)
.addHighlightField(
"title"
)
.setHighlightSimplePre(
"<span class=\"red\">"
)
.setHighlightSimplePost(
"</span>"
)
.setHighlightSnippets(
2
)
.setHighlightFragsize(
1000
)
.setStart(
0
)
.setRows(
10
)
.set(
"hl.useFastVectorHighlighter"
,
"true"
)
.set(
"hl.fragsize"
,
"200"
);
try
{
QueryResponse response = server.query(params);
SolrDocumentList list = response.getResults();
logger.info(
"########### 总共 : "
+ list.getNumFound() +
"条记录"
);
for
(SolrDocument doc : list) {
logger.info(
"######### id : "
+ doc.get(
"id"
) +
" title : "
+ doc.get(
"title"
));
}
Map<String, Map<String, List<String>>> map = response.getHighlighting();
Iterator<String> iterator = map.keySet().iterator();
while
(iterator.hasNext()) {
String key = iterator.next();
Map<String, List<String>> values = map.get(key);
logger.info(
"############################################################"
);
logger.info(
"############ id : "
+ key);
for
(Map.Entry<String, List<String>> entry : values.entrySet()) {
String subKey = entry.getKey();
List<String> subValues = entry.getValue();
logger.info(
"############ subKey : "
+ subKey);
for
(String str : subValues) {
logger.info(
"############ subValues : "
+ str);
}
}
}
}
catch
(SolrServerException e) {
logger.error(
""
, e);
}
}
}
|
POJO:
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
|
package
com.hcm.solr.entity;
import
java.io.Serializable;
import
org.apache.solr.client.solrj.beans.Field;
public
class
Message
implements
Serializable {
/**
*
*/
private
static
final
long
serialVersionUID = 1L;
private
String id;
private
String title;
private
String[] content;
public
Message() {
super
();
}
public
Message(String id, String title, String[] content) {
super
();
this
.id = id;
this
.title = title;
this
.content = content;
}
public
String getId() {
return
id;
}
@Field
(
"id"
)
public
void
setId(String id) {
this
.id = id;
}
public
String getTitle() {
return
title;
}
@Field
(
"title"
)
public
void
setTitle(String title) {
this
.title = title;
}
public
String[] getContent() {
return
content;
}
@Field
(
"content"
)
public
void
setContent(String[] content) {
this
.content = content;
}
}
|