1. 引入相关Jar包
<dependency>
<groupId>org.apache.solr</groupId>
<artifactId>solr-solrj</artifactId>
<version>6.5.0</version>
</dependency>
<!-- 测试代码用到,不需要可不加 -->
<dependency>
<groupId>com.alibaba</groupId>
<artifactId>fastjson</artifactId>
<version>1.2.12</version>
</dependency>
2.调用Solr搜索数据
* Solr测试类SolrTest.java
public class SolrTest {
private static Logger log = LogManager.getLogger();
public static void main(String[] args) throws Exception {
String solrUrl = "http://localhost:10001/solr/core_test";
HttpSolrClient client = new HttpSolrClient.Builder(solrUrl).build();
SolrQuery query = new SolrQuery();
query.set("wt", "json");
// 查询字符串,查询名称中有James/Curry,并且年龄为20~30(包含)的记录
query.set("q", "name:(James Curry) AND age:[20 TO 30]");
// 返回的记录包含哪些字段,多个用逗号空格分割
query.set("fl", "id,name,age");
query.set("sort", "age ASC,name DESC");
// 过滤查询:年龄范围25~30
// query.set("fq", "age:[25 TO 30]");
// ***********高亮 setting start***********
// 开启高亮
query.set("hl", "true");
// 高亮字段
query.set("hl.fl", "name");
// 高亮格式(前)
query.set("hl.simple.pre", "<span>");
// 高亮格式(后)
query.set("hl.simple.post", "</span>");
// ***********高亮 setting end***********
// 分页,返回数据由第几条记录开始
query.setStart(0);
// 分页,返回记录的条数
query.setRows(10);
//
QueryResponse response = client.query(query);
SolrDocumentList result = response.getResults();
//
List<Star> starList = response.getBeans(Star.class);
log.info("total:{},start:{},end:{}",result.getNumFound(),result.getStart(),result.getStart()+result.size());
log.info("----------列表数据----------");
for (Star star : starList) {
log.info(JSONObject.toJSONString(star));
}
log.info("----------高亮----------");
Map<String, Map<String, List<String>>> hlMap = response.getHighlighting();
Iterator<Entry<String, Map<String, List<String>>>> hlIterator = hlMap.entrySet().iterator();
while(hlIterator.hasNext()){
Entry<String, Map<String, List<String>>> hlItem = hlIterator.next();
log.info("id->{},highlight->{}",hlItem.getKey(),hlItem.getValue());
}
}
}
* Solr搜索记录对应实体类Star.java
import org.apache.solr.client.solrj.beans.Field;
public class Star {
@Field("id")
private String id;
@Field("name")
private String name;
@Field("age")
private int age;
public String getId() {
return id;
}
public void setId(String id) {
this.id = id;
}
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
public int getAge() {
return age;
}
public void setAge(int age) {
this.age = age;
}
}
搜索结果:
2017-04-21 17:17:37.765 [main] INFO - total:2,start:0,end:2
cn.tinyf.demo.solr.SolrTest
2017-04-21 17:17:37.766 [main] INFO - ----------列表数据----------
cn.tinyf.demo.solr.SolrTest
2017-04-21 17:17:37.820 [main] INFO - {"age":27,"id":"66654e81-c1a9-4961-b782-5513f0928f2a","name":"James Harden"}
cn.tinyf.demo.solr.SolrTest
2017-04-21 17:17:37.820 [main] INFO - {"age":28,"id":"18f483cc-afda-4cc5-926e-5035bc427239","name":"Curry"}
cn.tinyf.demo.solr.SolrTest
2017-04-21 17:17:37.820 [main] INFO - ----------高亮----------
cn.tinyf.demo.solr.SolrTest
2017-04-21 17:17:37.820 [main] INFO - id->66654e81-c1a9-4961-b782-5513f0928f2a,highlight->{name=[<span>James</span> Harden]}
cn.tinyf.demo.solr.SolrTest
2017-04-21 17:17:37.821 [main] INFO - id->18f483cc-afda-4cc5-926e-5035bc427239,highlight->{name=[<span>Curry</span>]}
cn.tinyf.demo.solr.SolrTest
3.添加&更新文档(记录)
更新主要方法有(反括号表示有带此参数的重载方法):
- addBean(Object [,int])
- add(SolrInputDocument [,int])
测试代码:
import org.apache.solr.client.solrj.impl.HttpSolrClient;
import cn.tinyf.demo.Utils;
public class SolrUpdateTest {
private static Scanner reader;
public static void main(String[] args) throws Exception {
String solrUrl = "http://localhost:10001/solr/core_test";
HttpSolrClient solrClient = null;
try {
// 构造输入
reader = new Scanner(System.in);
// 新建solr客户端
solrClient = new HttpSolrClient.Builder(solrUrl).build();
int menu = 0;
String line = null;
Star data;
while ((menu = selectMenu()) != 0) {
switch (menu) {
// 增加文档
case 1:
System.out.println(">>>增加记录<<<");
System.out.print("请输入name:");
line = reader.nextLine();
if (Utils.isEmpty(line)) {
break;
}
data = new Star();
data.setName(line);
System.out.print("请输入age:");
line = reader.nextLine();
if (Utils.isEmpty(line) || !line.trim().matches("\\d*")) {
break;
}
data.setAge(Integer.parseInt(line));
data.setId(Utils.uuid());
solrClient.addBean(data, 100);
System.out.println(">>>To do add next,id->" + line);
break;
// 修改
case 2:
System.out.println(">>>修改记录<<<");
System.out.print("请输入记录ID:");
line = reader.nextLine();
if (Utils.isNotEmpty(line)) {
solrClient.deleteById(line);
}
data = new Star();
data.setId(line);
System.out.print("请输入name:");
line = reader.nextLine();
if (Utils.isEmpty(line)) {
break;
}
data.setName(line);
System.out.print("请输入age:");
line = reader.nextLine();
if (Utils.isEmpty(line) || !line.trim().matches("\\d*")) {
break;
}
data.setAge(Integer.parseInt(line));
solrClient.addBean(data, 100);
System.out.println(">>>To do update next,id->" + line);
break;
// 刪除
case 3:
System.out.println(">>>删除记录<<<");
System.out.print("请输入记录ID:");
line = reader.nextLine();
if (Utils.isNotEmpty(line)) {
solrClient.deleteById(line);
}
System.out.println(">>>To do delete next,id->" + line);
break;
// 马上提交更改
case 4:
System.out.println(">>>Commit right now!");
solrClient.commit();
break;
default:
break;
}
}
} catch (Exception e) {
e.printStackTrace();
} finally {
reader.close();
if (solrClient != null) {
solrClient.commit();
}
}
}
private static int selectMenu() {
do {
System.out.println("******Solr Menu******");
System.out.println("*1.增加记录");
System.out.println("*2.更新记录");
System.out.println("*3.删除记录");
System.out.println("*4.提交更改");
System.out.println("*0.退出");
System.out.print("*********************\n请选择:");
String line = reader.nextLine();
if (line.matches("\\s*[0-4]\\s*")) {
return Integer.parseInt(line);
} else {
System.out.println(">>>选择错误(" + line + "),请重新选择<<<");
}
} while (true);
}
}
分享到:
相关推荐
Solr,全称为Apache Solr,是一款开源的企业级搜索平台,基于Java开发,广泛应用于全文检索、企业级内容管理和网站搜索。在Solr中,为了实现与数据库的实时同步,通常会采用增量索引策略,确保数据库中的新数据或...
6、支持多种通信框架(Mina/Netty/Grizzly),支持多种序列化/反序列化(Java/Hessian/PB); 7、支持自定义通信协议,可完全替换NFS-RPC自带的协议。 淘宝开放平台JAVA版SDK top4java 设计原则 容易维护扩展(不...
- **1.4.3 solr的各包的说明**:Solr的各个包按照功能模块划分,如org.apache.solr.client包包含了客户端相关的类,org.apache.solr.update包则负责索引更新等功能。 **1.5 版本说明** - **1.5.1 1.3版本**:介绍...
2. **调用第三方搜索引擎如Google、Baidu的API实现站内搜索**:这种方式简单快捷,但存在依赖外部服务的风险,并且对于高度定制化的需求支持不足。 3. **基于Compass+Lucene实现站内搜索**:适合于数据库驱动的应用...
6、支持多种通信框架(Mina/Netty/Grizzly),支持多种序列化/反序列化(Java/Hessian/PB); 7、支持自定义通信协议,可完全替换NFS-RPC自带的协议。 淘宝开放平台JAVA版SDK top4java 设计原则 容易维护扩展(不...
6、支持多种通信框架(Mina/Netty/Grizzly),支持多种序列化/反序列化(Java/Hessian/PB); 7、支持自定义通信协议,可完全替换NFS-RPC自带的协议。 淘宝开放平台JAVA版SDK top4java 设计原则 容易维护扩展(不...
6、支持多种通信框架(Mina/Netty/Grizzly),支持多种序列化/反序列化(Java/Hessian/PB); 7、支持自定义通信协议,可完全替换NFS-RPC自带的协议。 淘宝开放平台JAVA版SDK top4java 设计原则 容易维护扩展(不...
6、支持多种通信框架(Mina/Netty/Grizzly),支持多种序列化/反序列化(Java/Hessian/PB); 7、支持自定义通信协议,可完全替换NFS-RPC自带的协议。 淘宝开放平台JAVA版SDK top4java 设计原则 容易维护扩展(不...
6、支持多种通信框架(Mina/Netty/Grizzly),支持多种序列化/反序列化(Java/Hessian/PB); 7、支持自定义通信协议,可完全替换NFS-RPC自带的协议。 淘宝开放平台JAVA版SDK top4java 设计原则 容易维护扩展(不...
6、支持多种通信框架(Mina/Netty/Grizzly),支持多种序列化/反序列化(Java/Hessian/PB); 7、支持自定义通信协议,可完全替换NFS-RPC自带的协议。 淘宝开放平台JAVA版SDK top4java 设计原则 容易维护扩展(不...
6、支持多种通信框架(Mina/Netty/Grizzly),支持多种序列化/反序列化(Java/Hessian/PB); 7、支持自定义通信协议,可完全替换NFS-RPC自带的协议。 淘宝开放平台JAVA版SDK top4java 设计原则 容易维护扩展(不...
- 搜索接口的调用实例:实际演示如何调用Solr的搜索接口。 - Solrj的使用说明:介绍了如何使用SolrJ添加数据、直接添加POJO到Solr和从Solr读取数据。 - 创建查询:说明了如何创建查询并使用SolrJ进行索引的创建。 5...
6、支持多种通信框架(Mina/Netty/Grizzly),支持多种序列化/反序列化(Java/Hessian/PB); 7、支持自定义通信协议,可完全替换NFS-RPC自带的协议。 淘宝开放平台JAVA版SDK top4java 设计原则 容易维护扩展(不...
6、支持多种通信框架(Mina/Netty/Grizzly),支持多种序列化/反序列化(Java/Hessian/PB); 7、支持自定义通信协议,可完全替换NFS-RPC自带的协议。 淘宝开放平台JAVA版SDK top4java 设计原则 容易维护扩展(不...
6、支持多种通信框架(Mina/Netty/Grizzly),支持多种序列化/反序列化(Java/Hessian/PB); 7、支持自定义通信协议,可完全替换NFS-RPC自带的协议。 淘宝开放平台JAVA版SDK top4java 设计原则 容易维护扩展(不...
6、支持多种通信框架(Mina/Netty/Grizzly),支持多种序列化/反序列化(Java/Hessian/PB); 7、支持自定义通信协议,可完全替换NFS-RPC自带的协议。 淘宝开放平台JAVA版SDK top4java 设计原则 容易维护扩展(不...
6、支持多种通信框架(Mina/Netty/Grizzly),支持多种序列化/反序列化(Java/Hessian/PB); 7、支持自定义通信协议,可完全替换NFS-RPC自带的协议。 淘宝开放平台JAVA版SDK top4java 设计原则 容易维护扩展(不...
2. **调用第三方搜索引擎API**(如Google、Baidu):这种方式虽然简便快捷,但由于与第三方平台绑定紧密,不利于长期业务发展和功能扩展,因此仅作为临时方案。 3. **基于Compass+Lucene实现站内搜索**:适用于需要...