应用场景
当安装部署完solr之后,我们可以通过solrj来连接solr,进行新建,删除索引等等操作,达到全文检索的效果。
操作步骤
1. Solrj的使用
1.1什么是solrj
solrj是访问Solr服务的java客户端,提供索引和搜索的请求方法,SolrJ通常在嵌入在业务系统中,通过SolrJ的API接口操作Solr服务,如下图:

Solrj和图形界面操作的区别就类似于数据库中你使用jdbc和mysql客户端的区别一样。
1.2 添加solrj jar包
Solrj的包

Solr服务的依赖包

solrj5.4.0的jar包下载地址
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 server = new HttpSolrClient("http://192.168.199.23:8080/solr/collection1");
Map<String, Object> fields = new LinkedHashMap<>();
fields.put("name","product_name");
fields.put("type","text_ik");
fields.put("indexed",true);
fields.put("stored",true);
fields.put("multiValued",false);
fields.put("required",false);
SchemaRequest.AddField addFieldtoSchema = new SchemaRequest.AddField(fields);
server.request(addFieldtoSchema);
}
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 server = new HttpSolrClient("http://192.168.199.23:8080/solr/collection1");
SolrInputDocument document = new SolrInputDocument();
document.addField("id", "001");
document.addField("product_name", "张家港特产沙洲优黄");
document.addField("product_info", "沙洲优黄是江苏省张家港酿酒有限公司的著名产品。江苏省张家港酿酒有限公司是江苏酿酒行业重点骨干企业,紧靠张家港保税区和对外开放港口张家港,区域经济发达,自然条件优越,投资兴业环境优良。");
server.add(document);
server.commit();
}
5 修改索引
注:修改索引其实是和新增一样的,新增索引的时候域id是必须的,id也是唯一的:
如果新增的时候id不存在,则进行新增或添加操作;
如果新增的时候id存在,则进行修改操作,覆盖原来已添加的;
代码与新增过程保持不变。
6 删除索引
1、通过调用HttpSolrClient对象的deleteByQuery方法进行删除操作;
2、调用HttpSolrClient对象的commit方法进行提交。
这一步主要通过solrj对已建的索引进行删除操作。
主要有以下三种形式:



/**
* 删除域值
* @throws Exception
* 根据id来进行删除
*/
@Test
public void delFieldValue() throws Exception{
HttpSolrClient server = new HttpSolrClient("http://192.168.199.23:8080/solr/collection1");
server.deleteByQuery("product_name:沙洲优黄");
server.commit();
}
7 查询索引
1、创建solrQuery对象,来对对象设置查询条件;
2、创建QueryResponse对象,通过HttpSolrClient对象调用query方法,来获得执行搜索获得的返回值;
3、创建SolrDocumentList方法,通过QueryResponse对象调用getResults方法,来根据查询条件匹配出结果对象
4、最后进行遍历输出
这一步主要对前面新建了索引的数据进行查询。
查询参数:












@Test
public void search() throws Exception {
HttpSolrClient server = new HttpSolrClient("http://192.168.199.23:8080/solr/collection1");
SolrQuery query = new SolrQuery();
query.set("q", "product_name:沙洲优黄");
query.set("fq", "product_info:江苏省");
query.set("sort", "id desc");
query.setStart(0);
query.setRows(10);
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 {
HttpSolrClient server = new HttpSolrClient("http://192.168.199.23:8080/solr/collection1");
SolrQuery query = new SolrQuery();
query.set("q", "product_name:沙洲优黄");
query.set("fq", "product_info:江苏省");
query.set("sort", "id desc");
query.setStart(0);
query.setRows(10);
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));
}
}
}