solrJ介绍
solrJ是一个用来访问solr的java客户端,提供了索引和搜索的方法(将一些常用的命令封装进去了),通过solrJ提供的API 接口来操作solr服务。 SolrJ通过封装httpClient方法,来操作solr的API的。即SolrJ底层还是通过使用httpClient中的方法来完成Solr的操作
添加jar包,maven工程需要添加依赖,普通的java工程需要自己jar包。
maven工程依赖:
如果你本地仓库没有 zookeeper的jar包跟 slf4j-api的jar也会直接报错,maven工程可以去maven库找一下,普通的java工程,可以在网上找一下
maven库:http://mvnrepository.com/
启动Solr服务器
1.添加数据到索引库
/**
* 添加索引到solr服务器中
* @throws Exception
*/
@Test
public void testAddContent() throws Exception{
//设置solr服务器的路径,默认是使用第一个core库
String baseURL = "http://localhost:8085/solr/core"; //注意core是在Solr客户端定义过的库
// 1.创建服务器连接对象
HttpSolrServer httpSolrServer = new HttpSolrServer(baseURL);
// 2.创建新的文档对象
SolrInputDocument solrInputDocument = new SolrInputDocument();
//向文档中添加域以及对应的值,注意:所有的域必须在schema.xml中定义过
solrInputDocument.setField("id", "21");
solrInputDocument.setField("name", "zsp123");
solrInputDocument.setField("password", "密码");
solrInputDocument.setField("age", "11");
// 3.将文档写入索引库中
httpSolrServer.add(solrInputDocument);
// 4.进行手动提交,否则无法进行添加
httpSolrServer.commit();
}
查看添加的数据:
2.修改索引:根据id修改,如果id存在是修改,不存在是新增
/**
* 修改文档内容
* 修改其实和添加是一样的,因为只要添加的ID是一样的,那么就会把原来的删除了,然后再添加一个
* @throws IOException
* @throws SolrServerException
*/
@Test
public void updateContent() throws SolrServerException, IOException{
//设置solr服务器的路径,默认是使用第一个core库
String baseURL = "http://localhost:8085/solr/core";
// 1.创建服务器连接对象
HttpSolrServer httpSolrServer = new HttpSolrServer(baseURL);
// 2.创建新的文档对象
SolrInputDocument solrInputDocument = new SolrInputDocument();
//设置文档的域
solrInputDocument.setField("id", "21"); //如果id存在就是修改,不存在新增
solrInputDocument.setField("name", "zsp1232");
solrInputDocument.setField("password", "密码2");
solrInputDocument.setField("age", "112");
// 3.将文档写入索引库中
httpSolrServer.add(solrInputDocument);
// 4.进行手动提交,否则无法进行添加
httpSolrServer.commit();
}
查看修改结果:
3.删除索引,SolrJ封装了有很多方法:
3.1根据id删除:
/**
* 进行删除文档操作 :根据id删除
* @throws SolrServerException
* @throws IOException
*/
@Test
public void testDeleteById() throws Exception{
//设置solr服务器的路径,默认是使用第一个core库
String baseURL = "http://localhost:8085/solr/core";
// 1.创建服务器连接对象
HttpSolrServer httpSolrServer = new HttpSolrServer(baseURL);
//删除某个特定域的特定值的数据
httpSolrServer.deleteById("21");
//提交
httpSolrServer.commit();
}
3.2根据条件查询删除:
/**
* 进行删除文档操作 :根据条件查询删除
* @throws SolrServerException
* @throws IOException
*/
@Test
public void testDeleteByQ() throws Exception{
//设置solr服务器的路径,默认是使用第一个core库
String baseURL = "http://localhost:8085/solr/core";
// 1.创建服务器连接对象
HttpSolrServer httpSolrServer = new HttpSolrServer(baseURL);
//删除索引 ,参数是设置需要删除的数据的域和值
httpSolrServer.deleteByQuery("password:密码");
//删除全部,
//httpSolrServer.deleteByQuery("*:*");
//提交
httpSolrServer.commit();
}
注意:因为在(schema.xml中)制定业务域的时候如果indexed=false,即不被索引,所以不能根据域名去查询
4、查询索引
4.1简单查询:根据id查询索引
查询id为1的索引:
/**
* 简单查询:根据id查询索引
* @throws SolrServerException
* @throws IOException
*/
@Test
public void queryById() throws SolrServerException, IOException{
//1.创建连接
HttpSolrServer solrServer = new HttpSolrServer("http://localhost:8085/solr/core");
//2.创建查询语句
SolrQuery query = new SolrQuery();
//3.设置查询条件
query.set("q", "id:1");
//4.执行查询
QueryResponse queryResponse = solrServer.query(query);
//5.取文档列表public class SolrDocumentList extends ArrayList<SolrDocument>
SolrDocumentList documentList = queryResponse.getResults();
for (SolrDocument solrDocument : documentList) {
//取各个文档信息
System.out.println("id:"+solrDocument.get("id")+" ");
System.out.println("name:"+solrDocument.get("name")+" ");
System.out.println("password:"+solrDocument.get("password")+" ");
System.out.println("age:"+solrDocument.get("age")+" ");
}
}
查询结果:
4.2根据条件进行查询:
/**
* 根据条件进行查询
* @throws Exception
*/
@Test
public void quertByConditions () throws Exception{
//1.创建连接
HttpSolrServer solrServer = new HttpSolrServer("http://localhost:8085/solr/core");
//2.创建查询语句
SolrQuery query = new SolrQuery();
//3.设置查询条件
query.set("q", "刘");//设置查询关键字
query.setSort("id", ORDER.desc);//按照id降序排列
//分页条件
query.setStart(0); //从下标0开始
query.setRows(2); //查询条数为2条
query.set("df", "name");//默认在name域进行查询
//4、执行查询
QueryResponse queryResponse = solrServer.query(query);
//5.获取文档列表
SolrDocumentList documentList = queryResponse.getResults();
//获取总记录数
long numFound = documentList.getNumFound();
System.out.println("总记录数:" + numFound);
for (SolrDocument solrDocument : documentList) {
//取各个文档信息
System.out.println("id:"+solrDocument.get("id")+" ");
System.out.println("name:"+solrDocument.get("name")+" ");
System.out.println("password:"+solrDocument.get("password")+" ");
System.out.println("age:"+solrDocument.get("age")+" ");
System.out.println();
}
}
查询结果:
注:如果设置了默认查询域的话,自己又不想在这个域内查那么在查询关键字前要注明要在哪个域查,比如:”name:刘”:
例:
4.3 测试复杂查询:取高亮
/*
* 测试复杂查询:取高亮
*/
@Test
public void testHighLighting() throws Exception{
//1、创建连接
HttpSolrServer solrServer = new HttpSolrServer("http://localhost:8085/solr/core");
//2、创建查询语句
SolrQuery query = new SolrQuery();
//3、设置查询条件
query.set("q", "刘");//设置查询关键字
/* query.setSort("id", ORDER.desc);//按照id降序排列*/
query.setStart(0);
query.setRows(5);//分页条件
query.set("df", "name");
//开启高亮显示
query.setHighlight(true);
query.setHighlightSimplePre("<span style='color:red'>");
query.setHighlightSimplePost("</span>");
//4、执行查询
QueryResponse queryResponse = solrServer.query(query);
//5、取高亮
Map<String, Map<String, List<String>>> highlighting = queryResponse.getHighlighting();
//6、获取文档列表
SolrDocumentList documentList = queryResponse.getResults();
//7、遍历查询结果
for (SolrDocument solrDocument : documentList) {
System.out.print(solrDocument.get("id")+" ");
String id = (String) solrDocument.get("id"); //获取文档id
List<String> titleList = highlighting.get(id).get("name"); //获取条件查,高亮域
if (titleList !=null && titleList.size()>0) {
//取到高亮,输出高亮
System.out.print(titleList.get(0));
}
System.out.println();
}
}
查看结果: