应用场景
当安装部署完solr之后,我们可以通过solrj来连接solr,进行新建,删除索引等等操作,达到全文检索的效果。
操作步骤
1. Solrj的使用
1.1什么是solrj
solrj是访问Solr服务的java客户端,提供索引和搜索的请求方法,SolrJ通常在嵌入在业务系统中,通过SolrJ的API接口操作Solr服务,如下图:
Solrj和图形界面操作的区别就类似于数据库中你使用jdbc和mysql客户端的区别一样。
1.2 添加solrj jar包
Solrj的包
Solr服务的依赖包
2 初始化
- 步骤:
创建HttpSolrClient对象(solrj4的HttpSolrServer被废弃),通过它和Solr服务器建立连接;
- 说明:
这一步是第一步,通过URL来调用搭建的solr服务,让solr服务给我们提供增删改查索引服务:
3 添加域
- 步骤:
1、调用SchemaRequest.AddField,添加域的一个Map;
2、通过HttpSolrClient对象的request方法进行添加域属性;
- 说明:
这一步主要是向schema.xml中添加域,标识域的属性,是否存储,是否索引等。
- 添加域:
- 删除域:
- 更新域:
- 示例:
/**
* 添加域或删除域
* @throws Exception
*
*/
@Test
public void addFields() throws Exception{
//创建HttpSolrClient,可以访问solr服务,参数是solr服务的url
HttpSolrClient server = new HttpSolrClient("http://192.168.199.23:8080/solr/collection1");
//相当于在managed-schema文件中加入一个field
Map<String, Object> fields = new LinkedHashMap<>();
fields.put("name","product_name"); //域名
fields.put("type","text_ik"); //域的类型,可以是string,int,如果需要分词设为text_ik
fields.put("indexed",true); //是否索引,默认为true
fields.put("stored",true); //是否存储,默认为true
fields.put("multiValued",false); //是否多值,默认为false
fields.put("required",false); //是否必须,默认false,schema文件中有一个id已默认必须
//添加域
SchemaRequest.AddField addFieldtoSchema = new SchemaRequest.AddField(fields);
server.request(addFieldtoSchema);
//删除域
// SchemaRequest.DeleteField delFieldtoSchema = new SchemaRequest.DeleteField("product_name");
// server.request(delFieldtoSchema);
//更新域
// SchemaRequest.ReplaceField repFieldtoSchema = new SchemaRequest.ReplaceField(fields);
// server.request(repFieldtoSchema);
}
4 新增索引
- 步骤:
1、创建SolrInputDocument对象,然后通过它来添加域值;
2、调用SolrInputDocument的对象的addField方法添加域值;
3、通过HttpSolrClient对象将SolrInputDocument添加到索引库;(如果id存在,则进行修改操作);
4、调用HttpSolrClient对象的commit方法进行提交。
- 说明:
这一步主要是给值添加索引。其中域id是必须需要添加的,这是由底层配置文件决定的,id中有一个属性叫required,是唯一一个,如果不添加id,会报错。
- 添加,并提交:
- 示例:
/**
* 添加域值或修改域值
* @throws Exception
* 根据id来添加,如果id存在则看成是修改进行覆盖,如果id不存在则是添加
*/
@Test
public void addFieldValue() throws Exception{
//创建HttpSolrClient,可以访问solr服务,参数是solr服务的url
HttpSolrClient server = new HttpSolrClient("http://192.168.199.23:8080/solr/collection1");
//创建SolrInputDocument对象,然后通过它来添加域值。
SolrInputDocument document = new SolrInputDocument();
// 第一个参数:域的名称,域的名称必须是在schema.xml中定义的,也就是上一步操作了
// 第二个参数:域的值
// 注意:id的域不能少,因为底层schema配置文件决定,id是required的
document.addField("id", "001");
document.addField("product_name", "张家港特产沙洲优黄");
document.addField("product_info", "沙洲优黄是江苏省张家港酿酒有限公司的著名产品。江苏省张家港酿酒有限公司是江苏酿酒行业重点骨干企业,紧靠张家港保税区和对外开放港口张家港,区域经济发达,自然条件优越,投资兴业环境优良。");
//通过HttpSolrServer对象将SolrInputDocument添加到索引库。
// 执行添加操作,如果该id存在,则进行修改
server.add(document);
//提交
server.commit();
}
5 修改索引
注:修改索引其实是和新增一样的,新增索引的时候域id是必须的,id也是唯一的:
如果新增的时候id不存在,则进行新增或添加操作;
如果新增的时候id存在,则进行修改操作,覆盖原来已添加的;
代码与新增过程保持不变。
6 删除索引
- 步骤:
1、通过调用HttpSolrClient对象的deleteByQuery方法进行删除操作;
2、调用HttpSolrClient对象的commit方法进行提交。
- 说明:
这一步主要通过solrj对已建的索引进行删除操作。
主要有以下三种形式:
- 根据id来删除索引:
- 根据查询条件来删除:
- 全部删除,注意慎用:
- 示例:
/**
* 删除域值
* @throws Exception
* 根据id来进行删除
*/
@Test
public void delFieldValue() throws Exception{
//创建HttpSolrClient,可以访问solr服务,参数是solr服务的url
HttpSolrClient server = new HttpSolrClient("http://192.168.199.23:8080/solr/collection1");
// 根据id删除
// server.deleteById("001");
// 根据查询条件删除
server.deleteByQuery("product_name:沙洲优黄");
// 全部删除、慎用!!!!
// server.deleteByQuery("*:*");
// 提交
server.commit();
}
7 查询索引
- 步骤:
1、创建solrQuery对象,来对对象设置查询条件;
2、创建QueryResponse对象,通过HttpSolrClient对象调用query方法,来获得执行搜索获得的返回值;
3、创建SolrDocumentList方法,通过QueryResponse对象调用getResults方法,来根据查询条件匹配出结果对象
4、最后进行遍历输出
- 说明:
这一步主要对前面新建了索引的数据进行查询。
查询参数:
- 创建solrQuery对象:
- 设置查询条件(q),两种写法:
- 设置过滤查询条件(fq),两种写法:
- 设置排序(sort),两种写法:
- 设置分页信息(start,rows):
- 设置fl指定返回结果字段:
- 设置默搜索域df:
- 设置高亮:
- 执行搜索获得返回值:
- 根据查询条件匹配出结果对象:
- 结果展示:
- 示例:
@Test
public void search() throws Exception {
// 创建HttpSolrServer,可以访问solr服务
// 参数就是solr服务的url
HttpSolrClient server = new HttpSolrClient("http://192.168.199.23:8080/solr/collection1");
// 创建solrQuery对象
SolrQuery query = new SolrQuery();
// 设置q,查询条件
//query.setQuery("product_name:张家港");
query.set("q", "product_name:沙洲优黄");
// 设置fq,过滤查询条件
//query.setFilterQueries("product_info:张家港");
query.set("fq", "product_info:江苏省");
// 设置sort,排序
//query.setSort("id", ORDER.desc);
query.set("sort", "id desc");
// 设置start、rows,分页信息(写上默认值)
query.setStart(0);
query.setRows(10);
// 设置fl,即要显示的域的列表
query.set("fl", "id,product_name","product_info");
// 设置默认搜索域
query.set("df", "product_info,product_name,id");
// 设置高亮
query.setHighlight(true);
query.addHighlightField("product_info");
query.addHighlightField("product_name");
query.setHighlightSimplePre("<font style=\"color:red\">");
query.setHighlightSimplePost("</font>");
// 执行搜索,并获得返回值
QueryResponse response = server.query(query);
// 根据查询条件匹配出的结果对象
SolrDocumentList list = response.getResults();
// 匹配出的结果总数
long count = list.getNumFound();
//输出查询结果
System.out.println("匹配出的结果总数:" + count);
for (SolrDocument solrDocument : list) {
System.out.println("商品id:" + solrDocument.get("id"));
System.out.println("商品名称:" + solrDocument.get("product_name"));
System.out.println("商品信息:" + solrDocument.get("product_info"));
}
System.out.println("----------------------------------------------------");
}
8 高亮设置
- 步骤:
1、创建solrQuery对象,来对对象设置查询条件;
2、创建QueryResponse对象,通过HttpSolrClient对象调用query方法,来获得执行搜索获得的返回值;
3、创建SolrDocumentList对象,通过QueryResponse对象调用getResults方法,来根据查询条件匹配出结果对象;
4、调用QueryResponse对象的getHighlighting方法获取高亮列表; 5、遍历结果列表,获得本文档的高亮信息;
6、循环遍历高亮后的信息,进行输出。
- 说明:
这一步主要给查询条件给出的字段,给予高亮显示。
- 获取高亮列表:
- 获得文档高亮信息,以及高亮结果展示:
- 示例:
@Test
public void search() throws Exception {
// 创建HttpSolrServer,可以访问solr服务
// 参数就是solr服务的url
HttpSolrClient server = new HttpSolrClient("http://192.168.199.23:8080/solr/collection1");
// 创建solrQuery对象
SolrQuery query = new SolrQuery();
// 设置q,查询条件
//query.setQuery("product_name:张家港");
query.set("q", "product_name:沙洲优黄");
// 设置fq,过滤查询条件
//query.setFilterQueries("product_info:张家港");
query.set("fq", "product_info:江苏省");
// 设置sort,排序
//query.setSort("id", ORDER.desc);
query.set("sort", "id desc");
// 设置start、rows,分页信息(写上默认值)
query.setStart(0);
query.setRows(10);
// 设置fl,即要显示的域的列表
query.set("fl", "id,product_name","product_info");
// 设置默认搜索域
query.set("df", "product_info,product_name,id");
// 设置高亮
query.setHighlight(true);
query.addHighlightField("product_info");
query.addHighlightField("product_name");
query.setHighlightSimplePre("<font style=\"color:red\">");
query.setHighlightSimplePost("</font>");
// 执行搜索,并获得返回值
QueryResponse response = server.query(query);
// 根据查询条件匹配出的结果对象
SolrDocumentList list = response.getResults();
// 匹配出的结果总数
long count = list.getNumFound();
//获取高亮列表
Map<String, Map<String, List<String>>> highlighting = response.getHighlighting();
for (SolrDocument solrDocument : list) {
System.out.println("商品id:" + solrDocument.get("id"));
System.out.println("商品名称:" + solrDocument.get("product_name"));
System.out.println("商品信息:" + solrDocument.get("product_info"));
//获得本文档的高亮信息
List<String> list2 = highlighting.get(solrDocument.get("id")).get("product_info");
if(list2!=null){
System.out.println("高亮后的信息:"+list2.get(0));
}
//获得本文档的高亮信息
List<String> list3 = highlighting.get(solrDocument.get("id")).get("product_name");
if(list2!=null){
System.out.println("高亮后的信息:"+list3.get(0));
}
}
}