一.SolrJ的概念
是一个API,它使用Java(或任何基于JVM的语言)编写的应用程序可以轻松地与Solr交谈。SolrJ隐藏了许多连接到Solr的细节,并允许您的应用程序通过简单的高级方法与Solr交互。SolrJ支持大多数Solr API,并且具有高度可配置性。
这里使用Maven构建项目,请将以下内容放入pom.xml:
org.apache.solr
solr-solrj
7.4.0
为了方便测试,导入单元测试依赖和日志依赖
junit
junit
4.12
test
org.slf4j
slf4j-nop
1.7.25
二.SolrJ的单机连接
SolrClient是一个抽象类,下边有很多被实现的子类,HttpSolrClient- 面向以查询为中心的工作负载,但也是一个很好的通用客户端。直接与单个Solr节点通信。
不同solr版本solrj 的创建方式有所不同
//solr4创建方式
SolrServer solrServer = newHttpSolrServer(solrUrl);//solr5创建方式,在url中指定core名称:core1
HttpSolrClient solrClient = new HttpSolrClient(solrUrl);//solr7创建方式,在url中指定core名称:core1
HttpSolrClient solrClient = new HttpSolrClient.Builder(solrUrl).build();
例如:
package com.xyg.solr;
import org.apache.solr.client.solrj.impl.HttpSolrClient;
import org.junit.Test;/**
* Author: Mr.Deng
* Date: 2018/9/10
* Desc: 测试连接客户端*/
public classtestConnectionClient {
@Testpublic voidtestConnectionClient(){//设置solr客户端url地址
String solrUrl = "http://node21:8080/solr/new_core";//创建solrClient同时指定超时时间,不指定走默认配置
HttpSolrClient solrClient = newHttpSolrClient.Builder(solrUrl)
.withConnectionTimeout(10000)
.withSocketTimeout(60000)
.build();
System.out.println(solrClient);
}
}
三.SolrJ的集群连接
CloudSolrClient- 面向与SolrCloud部署的通信。使用已记录的ZooKeeper状态来发现并将请求路由到健康的Solr节点。
package com.xyg.solrCloud;
import org.apache.solr.client.solrj.impl.CloudSolrClient;
import org.junit.Test;/**
* Author: Mr.Deng
* Date: 2018/9/10
* Desc: 测试连接客户端*/
public classConnectionCloudSolrClient {
@Testpublic voidconnectionCloudSolrClient(){//第一种方式:使用运行中的某一台solr节点//final String solrUrl = "http://192.168.100.21:8983/solr";//CloudSolrClient solrClient = new CloudSolrClient.Builder().withSolrUrl(solrUrl).build();//第二种方式:使用zookeeper节点连接(推荐)
final String zkHost = "node21:2181,node22:2181,node23:2181/solr";
CloudSolrClient solrClient= newCloudSolrClient.Builder().withZkHost(zkHost).build();
System.out.println(solrClient);
}
}
四.SolrJ的增删改查
这里测试单机版APi操作
1.创建索引
1)指定id单条创建索引
@Testpublic voidaddIndexById() throws IOException, SolrServerException {
String solrUrl= "http://node21:8080/solr/new_core";
HttpSolrClient solrClient= newHttpSolrClient.Builder(solrUrl).build();//创建索引文档对象
SolrInputDocument doc = newSolrInputDocument();//第一个参数:域的名称,域的名称必须是在schema.xml中定义的//第二个参数:域的值,注意:id的域不能少
doc.addField("id","1");
doc.addField("name","红豆");
doc.addField("price","1.2");//3.将文档写入索引库中
solrClient.add(doc);
solrClient.commit();
}
2)批量创建索引
@Testpublic voidaddIndexByListId() throws Exception {
String solrUrl= "http://node21:8080/solr/new_core";
HttpSolrClient solrClient= newHttpSolrClient.Builder(solrUrl).build();//创建索引文档对象
SolrInputDocument doc1 = newSolrInputDocument();
doc1.addField("id", "2");
doc1.addField("name", "绿豆");
doc1.addField("price", 1.8);
SolrInputDocument doc2= newSolrInputDocument();
doc2.addField("id", "3");
doc2.addField("name", "黑豆");
doc2.addField("price", 2.6);
Collection docs = new ArrayList();
docs.add(doc1);
docs.add(doc2);//3.将文档写入索引库中
solrClient.add(docs);
solrClient.commit();
}
2.查询索引
1)匹配查询
@Testpublic voidfindIndex1() throws IOException, SolrServerException {
String solrUrl= "http://node21:8080/solr/new_core";
HttpSolrClient solrClient= newHttpSolrClient.Builder(solrUrl).build();//创建搜索对象
SolrQuery query = newSolrQuery();//设置搜索条件
query.set("q","*:*");//设置每页显示多少条
query.setRows(2);//发起搜索请求
QueryResponse response =solrClient.query(query);//查询结果
SolrDocumentList docs =response.getResults();//查询结果总数
long cnt =docs.getNumFound();
System.out.println("总条数为"+cnt+"条");for(SolrDocument doc : docs) {
System.out.println("id:"+ doc.get("id") + ",name:"+ doc.get("name") + ",price:"+ doc.get("price"));
}
solrClient.close();
}
2)条件过滤查询
@Testpublic voidfindIndex2() throws IOException, SolrServerException {
String solrUrl= "http://node21:8080/solr/new_core";
HttpSolrClient solrClient= newHttpSolrClient.Builder(solrUrl).build();//2 封装查询参数
Map queryParamMap = new HashMap();
queryParamMap.put("q", "*:*");//3 添加到SolrParams对象,SolrParams 有一个 SolrQuery 子类,它提供了一些方法极大地简化了查询操作
MapSolrParams queryParams = newMapSolrParams(queryParamMap);//4 执行查询返回QueryResponse
QueryResponse response =solrClient.query(queryParams);//5 获取doc文档
SolrDocumentList docs =response.getResults();//查询结果总数
long cnt =docs.getNumFound();
System.out.println("总条数为" + cnt + "条");//[6]内容遍历
for(SolrDocument doc : docs) {
System.out.println("id:" + doc.get("id") + ",name:" + doc.get("name") + ",price:" + doc.get("price"));
}
solrClient.close();
}
3.更新索引
@Testpublic voidupdateIndex() throws IOException, SolrServerException {
String solrUrl= "http://node21:8080/solr/new_core";
HttpSolrClient solrClient= newHttpSolrClient.Builder(solrUrl).build();//创建索引文档对象
SolrInputDocument doc = newSolrInputDocument();//把红豆价格修改为1.5
doc.addField("id","1");
doc.addField("name","红豆");
doc.addField("price","1.5");//3.将文档写入索引库中
solrClient.add(doc);
solrClient.commit();//提交
solrClient.commit();
}
4.删除索引
1)单一条件删除
@Testpublic voiddeleteIndexById() throws IOException, SolrServerException {
String solrUrl= "http://node21:8080/solr/new_core";
HttpSolrClient solrClient= newHttpSolrClient.Builder(solrUrl).build();//全删//solrClient.deleteByQuery("*:*");//模糊匹配删除(带有分词效果的删除)
solrClient.deleteByQuery("name:红");//指定id删除//solrClient.deleteById("1");
solrClient.commit();
}
2)批量条件删除
@Testpublic voiddeleteIndexByListId() throws IOException, SolrServerException {
String solrUrl= "http://node21:8080/solr/new_core";
HttpSolrClient solrClient= newHttpSolrClient.Builder(solrUrl).build();//通过id删除
ArrayList ids = new ArrayList();
ids.add("2");
ids.add("3");
solrClient.deleteById(ids);//[3]提交
solrClient.commit();//[4]关闭资源
solrClient.close();
}
五.代码报错问题
1.代码添加索引报405问题
解决方法:
在使用Tomcat部署Solr后,new_core的地址为:http://node21:8080/solr/#/new_core,但使用SolrJ进行索引的时候,应该使用http://node21:8080/solr/new_core,即无中间的#号。
2.自定义索引字段
上图报错提示未识别索引字段
参考文档: