上面一章节已经讲完了solr的安装与配置,现在说一下使用solrj来维护solr的索引及操作,solrj就是一个java的客户端,是一个jar包的使用
首先引入MAVEN的依赖,solrj的版本号要对应solr的版本号
<dependency>
<groupId>org.apache.solr</groupId>
<artifactId>solr-solrj</artifactId>
<version>7.0.1</version>
</dependency>
一.solr的使用
package com.solr.web.app.util.solr;
import java.io.IOException;
import java.util.ArrayList;
import java.util.List;
import java.util.Map;
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.StringUtils;
import com.solr.web.app.pay.officeorder.entity.CompanyInfo;
import com.solr.web.app.pay.officeorder.entity.Follow;
public final class FollowTest {
private static HttpSolrServer server;
private static final String DEFAULT_URL = "http://localhost:8080/solr/crm_follow";
public static void init() {
server = new HttpSolrServer(DEFAULT_URL);
}
public static void indexUser(List<Follow> list) {
try {
// 添加user bean到索引库
try {
UpdateResponse response = server.addBeans(list);
server.commit();
System.out.println(response.getStatus());
} catch (IOException e) {
e.printStackTrace();
}
} catch (SolrServerException e) {
e.printStackTrace();
}
}
public static void deleteAll() {
try {
server.deleteByQuery("*:*");
server.commit(false, false);
} catch (Exception e) {
e.printStackTrace();
}
}
public static List<Follow> testQueryAll(String name) {
List<Follow> followList = null;
SolrQuery params = new SolrQuery();
// 查询关键词,*:*代表所有属性、所有值,即所有index
if (StringUtils.isEmpty(name)) {
params.set("q", "*:*");
} else {
params.set("q", "content:" + name);
}
// 分页,start=0就是从0开始,rows=5当前返回5条记录,第二页就是变化start这个值为5就可以了。
params.set("start", 0);
params.set("rows", Integer.MAX_VALUE);
// 排序,如果按照id排序,那么将score desc 改成 id desc(or asc)
// params.set("sort", "score desc");
params.set("sort", "id asc");
// 返回信息*为全部,这里是全部加上score,如果不加下面就不能使用score
params.set("fl", "*,score");
QueryResponse response = null;
try {
response = server.query(params);
} catch (SolrServerException | IOException e) {
e.printStackTrace();
}
if (response != null) {
followList = new ArrayList<Follow>();
Follow follow = null;
Map<String, Map<String, List<String>>> map = response.getHighlighting();
SolrDocumentList list = response.getResults();
for (int i = 0; i < list.size(); i++) {
follow = new Follow();
SolrDocument solrDocument = list.get(i);
follow.setId(solrDocument.getFieldValue("id").toString());
follow.setType(solrDocument.getFieldValue("type").toString());
follow.setContent(solrDocument.getFieldValue("content").toString());
follow.setRemarks(solrDocument.getFieldValue("remarks").toString());
followList.add(follow);
}
}
return followList;
}
public static void main(String[] args) {
init();
//删除全部索引
deleteAll();
System.out.println("删除成功--------------------------");
//新增索引
List<Follow> list = new ArrayList<Follow>();
Follow follow = new Follow();
follow.setId("12000");
follow.setContent("跟进客户,预计明天成单!");
follow.setType("1");
follow.setRemarks("明天中午打电话");;
list.add(follow);
indexUser(list);
System.out.println("添加成功--------------------------");
System.out.println("开始查找--------------------------");
System.out.println(testQueryAll("").get(0).getContent());
}
}
运行结果:
删除成功--------------------------
添加成功--------------------------
开始查找--------------------------
跟进客户,预计明天成单!
二.solrJ的使用
1.solrJ新增和修改索引
/**
* 往索引库添加文档。id不存在,则增加,如果id存在,则是修改。
* @throws IOException
* @throws SolrServerException
*/
public void addDoc(String id) throws SolrServerException, IOException{
//构造一篇文档
SolrInputDocument document = new SolrInputDocument();
//往doc中添加字段,在客户端这边添加的字段必须在服务端中有过定义
document.addField("id", id);
document.addField("type", "");
document.addField("content", "");
document.addField("remakers", "");
//获得一个solr服务端的请求,去提交 ,选择具体的某一个solr core
HttpSolrClient solr = new HttpSolrClient(SOLR_URL);
solr.add(document);
solr.commit();
solr.close();
}
2.solrJ删除索引
/**
* 根据id从索引库删除文档
*/
public void deleteDocumentById() throws Exception {
//选择具体的某一个solr core
HttpSolrClient server = new HttpSolrClient(SOLR_URL);
//删除文档
//server.deleteById("1");
//删除所有的索引
server.deleteByQuery("*:*");
//提交修改
server.commit();
server.close();
}
3.solrJ查找索引
/**
* 查询
* @throws Exception
*/
public static List<Follow> querySolr(String name) throws Exception{
HttpSolrClient solrServer = new HttpSolrClient(SOLR_URL);
SolrQuery query = new SolrQuery();
//下面设置solr查询参数
//query.set("q", "*:*");// 参数q 查询所有
query.set("q",name);//相关查询,比如某条数据某个字段含有周、星、驰三个字 将会查询出来 ,这个作用适用于联想查询
//参数fq, 给query增加过滤查询条件
query.addFilterQuery("id:[0 TO 9]");//id为0-4
//给query增加布尔过滤条件
//query.addFilterQuery("description:演员"); //description字段中含有“演员”两字的数据
//参数df,给query设置默认搜索域
query.set("df", "name");
//参数sort,设置返回结果的排序规则
query.setSort("id",SolrQuery.ORDER.desc);
//设置分页参数
query.setStart(0);
query.setRows(10);//每一页多少值
//参数hl,设置高亮
query.setHighlight(true);
//设置高亮的字段
query.addHighlightField("name");
//设置高亮的样式
query.setHighlightSimplePre("<font color='red'>");
query.setHighlightSimplePost("</font>");
//获取查询结果
QueryResponse response = solrServer.query(query);
//两种结果获取:得到文档集合或者实体对象
//查询得到文档的集合
SolrDocumentList solrDocumentList = response.getResults();
System.out.println("通过文档集合获取查询的结果");
System.out.println("查询结果的总数量:" + solrDocumentList.getNumFound());
//遍历列表
for (SolrDocument doc : solrDocumentList) {
System.out.println("id:"+doc.get("id")+" content:"+doc.get("content")+" type:"+doc.get("type"));
}
//得到实体对象
List<Follow> tmpLists = response.getBeans(Follow.class);
if(tmpLists!=null && tmpLists.size()>0){
System.out.println("通过文档集合获取查询的结果");
for(Follow per:tmpLists){
System.out.println("id:"+per.getId()+" content:"+per.getContent()+" type:"+per.getType());
}
}
return tmpLists;
}