一.Solrj实现索引库数据的更新
solrj的版本要和solr的版本对应. solrj是一款java操作solr的工具jar包. spring也可以很方便的整合solrj.
@Test
public void testDel() throws Exception {
/*声明baseSolrUrl*/
String baseSolrUrl = "http://192.168.15.30:8983/solr/solr_core";
/*创建Builder对象, 是HttpSolrClient的内部类*/
HttpSolrClient.Builder builder = new HttpSolrClient.Builder(baseSolrUrl);
/*HttpSolrClient连接Solr服务的客户端对象, 不能直接创建, 需要使用Builder创建*/
HttpSolrClient client = builder.build();
/*根据id进行删除*/
// UpdateResponse resp = client.deleteById("abba722b-ed52-4595-a56b-e1f0bc28130d");
UpdateResponse resp = client.deleteByQuery("id:ec55e023-74c6-4d3f-9944-e55e27eca1d3");// q
if(resp.getStatus() == 0) {
client.commit();
} else {
client.rollback();
}
client.close();
}
@Test
public void testAddUpdate() throws Exception {
/*声明baseSolrUrl*/
String baseSolrUrl = "http://192.168.15.30:8983/solr/solr_core";
/*创建Builder对象, 是HttpSolrClient的内部类*/
HttpSolrClient.Builder builder = new HttpSolrClient.Builder(baseSolrUrl);
/*HttpSolrClient连接Solr服务的客户端对象, 不能直接创建, 需要使用Builder创建*/
HttpSolrClient client = builder.build();
/*准备要新增或修改的数据*/
SolrInputDocument doc = new SolrInputDocument();
doc.addField("id", "abba722b-ed52-4595-a56b-e1f0bc28130d");
doc.addField("product_name", "华为荣耀手机");
doc.addField("product_price", 2999);
/*新增和更新操作需要调用add方法*/
client.add(doc);
/*提交事务*/
client.commit();
/*关闭资源*/
client.close();
}
二.Solrj实现索引库数据的查询
@Test
public void testQuery() throws Exception {
/*声明baseSolrUrl*/
String baseSolrUrl = "http://192.168.15.30:8983/solr/solr_core";
/*创建Builder对象, 是HttpSolrClient的内部类*/
HttpSolrClient.Builder builder = new HttpSolrClient.Builder(baseSolrUrl);
/*HttpSolrClient连接Solr服务的客户端对象, 不能直接创建, 需要使用Builder创建*/
HttpSolrClient client = builder.build();
/*准备查询条件, SolrParams是一个抽象类, 所以条件对象使用其子类SolrQuery对象*/
// SolrQuery params = new SolrQuery("*:*"); // q查询
SolrQuery params = new SolrQuery();
/*q: 查询条件*/
params.setQuery("幸福一家人");
/*df: 设置默认查询字段*/
params.set("df", "product_name");
/*sort: 设置排序*/
params.setSort("product_price", SolrQuery.ORDER.desc);
/*fl: 字段列表*/
// params.set("fl", "id,product_name");
/*fq: 添加过滤查询条件*/
// params.addFilterQuery("product_price:15");
/*start, rows: 设置分页*/
params.setStart(5);
params.setRows(5);
/*hl: 设置高亮显示*/
params.setHighlight(true);
params.addHighlightField("product_name");
params.setHighlightSimplePre("<span style='color:red'>");
params.setHighlightSimplePost("</span>");
/*查询需要调用query方法*/
QueryResponse resp = client.query(params);
/*处理结果*/
SolrDocumentList results = resp.getResults();
/*总记录数*/
System.out.println("numFound: " + results.getNumFound());
/*获取高亮数据*/
Map<String, Map<String, List<String>>> hl = resp.getHighlighting();
List<Product> list = new ArrayList<>();
for (SolrDocument result : results) {
Product product = new Product();
String id = result.get("id").toString();
product.setId(id);
/*处理高亮数据的替换*/
String name = result.get("product_name").toString();
Map<String, List<String>> map = hl.get(id);
if(map != null) {
List<String> temp = map.get("product_name");
if(temp != null && temp.size() > 0) {
name = temp.get(0);
}
}
product.setName(name);
product.setCatalog(Integer.parseInt(result.get("catalog").toString()));
product.setCatalogName(result.get("catalog_name").toString());
product.setPrice(Double.parseDouble(result.get("product_price").toString()));
list.add(product);
System.out.println(product);
System.out.println("------------------------------------------------------------");
}
/*关闭资源*/
client.close();
}
三.Solrj中常用的API
1.HttpSolrClient
HttpSolrClient, 连接solr服务器的客户端对象, 所有的增删改查操作都是通过该对象完成的.
2.Builder
Builder, 是HttpSolrClient中的内部类, 用来构建HttpSolrClient对象.
3.SolrInputDocument
SolrInputDocument, 表示要新增/修改的数据对象. 可以作为add方法的参数.
4.UpdateResponse
UpdateResponse, 表示更新操作的响应对象, 通过该对象查看响应状态码.
5.SolrParams
SolrParams, 查询时封装的参数, 是一个抽象类.
6.SolrQuery
SolrQuery, 是SolrParams的子类, 一般用于封装查询条件.
7.QueryResponse
QueryResponse, 查询的响应结果对象, 所有的查询结果都被封装到该对象中, 包含响应头, 响应体和高亮数据.
8.SolrDocumentList
SolrDocumentList, QueryResponse对象调用getResults方法得到的结果对象, 用于表示查询的响应体. 继承了ArrayList.
9.SolrDocument
SolrDocument, 表示一条文档(document).
10.DocumentObjectBinder
DocumentObjectBinder, 是Solrj中提供的一个工具类. 可以将Document和实体类进行双向绑定. 可以将java对象转换为SolrInputDocument对象, 同时, 也可以将SolrDocument转换为java对象. 需要在实体类中通过@Field
注解进行映射.
@Test
public void testDocumentObjectBinder() throws Exception {
SolrQuery params = new SolrQuery("product_name:幸福一家人");
QueryResponse resp = httpSolrClient.query(params);
// 获取响应实体
SolrDocumentList results = resp.getResults();
// 创建DocumentObjectBinder对象
DocumentObjectBinder binder = new DocumentObjectBinder();
// 类型转换SolrDocumentList --> 实体类集合对象
List<Product> list = binder.getBeans(Product.class, results);
for (Product product : list) {
System.out.println(product);
}
}
/**
* 执行solr索引库的更新操作
*
* @param entity
* @param <T>
* @return
*/
public <T> UpdateResponse update(T entity) {
try {
DocumentObjectBinder binder = new DocumentObjectBinder();
// 类型转换实体类对象 --> SolrInputDocument对象
SolrInputDocument doc = binder.toSolrInputDocument(entity);
UpdateResponse resp = httpSolrClient.add(doc);
httpSolrClient.commit();
return resp;
} catch (Exception e) {
e.printStackTrace();
try {
httpSolrClient.rollback();
} catch (SolrServerException ex) {
ex.printStackTrace();
} catch (IOException ex) {
ex.printStackTrace();
}
}
return null;
}
四.Solr查询练习
在web项目中实现商品信息的关键字查询, 过滤查询, 结果分页显示, 排序, 数据的高亮显示. Spring+SpringMVC+SolrJ