solr版本:8.x
springboot版本:1.5.6
1.准备springboot项目,pom.xml需要引入以下jar包
<properties>
<project.final.name>htsolr</project.final.name>
<java.version>1.8</java.version>
<project.build.sourceEncoding>UTF-8</project.build.sourceEncoding>
<!--solr支持的版本-->
<spring.data.solr.version>2.1.1.RELEASE</spring.data.solr.version>
</properties>
<!--solr支持的版本-->
<dependency>
<groupId>org.springframework.data</groupId>
<artifactId>spring-data-solr</artifactId>
</dependency>
<dependencyManagement>
<dependencies>
<dependency>
<groupId>org.springframework.data</groupId>
<artifactId>spring-data-solr</artifactId>
<version>${spring.data.solr.version}</version>
</dependency>
</dependencies>
</dependencyManagement>
主要引入spring-data-solr的2个支持包即可,另外再贴上整个pom.xml文件吧
<project xmlns="http://maven.apache.org/POM/4.0.0"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd">
<!-- 本项目配置参数 -->
<modelVersion>4.0.0</modelVersion>
<groupId>com.hornet.solr</groupId>
<artifactId>ht-server-solr</artifactId>
<packaging>jar</packaging>
<name>ht-server-solr</name>
<description>操作solr项目</description>
<!-- 定义一些项目所用常量 -->
<properties>
<project.final.name>htsolr</project.final.name>
<java.version>1.8</java.version>
<project.build.sourceEncoding>UTF-8</project.build.sourceEncoding>
<spring.data.solr.version>2.1.1.RELEASE</spring.data.solr.version>
</properties>
<!-- 引入springboot父类pom说明 -->
<parent>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-parent</artifactId>
<version>1.5.6.RELEASE</version>
</parent>
<dependencies>
<!-- 引入springboot支持 -->
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-web</artifactId>
</dependency>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-devtools</artifactId>
</dependency>
<dependency>
<groupId>org.springframework</groupId>
<artifactId>spring-context</artifactId>
</dependency>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-configuration-processor</artifactId>
<optional>true</optional>
</dependency>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-actuator</artifactId>
</dependency>
<dependency>
<groupId>org.springframework.data</groupId>
<artifactId>spring-data-solr</artifactId>
</dependency>
</dependencies>
<dependencyManagement>
<dependencies>
<dependency>
<groupId>org.springframework.data</groupId>
<artifactId>spring-data-solr</artifactId>
<version>${spring.data.solr.version}</version>
</dependency>
</dependencies>
</dependencyManagement>
<!-- 打包 -->
<build>
<finalName>${project.final.name}</finalName>
<plugins>
<plugin>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-maven-plugin</artifactId>
</plugin>
</plugins>
</build>
</project>
2.项目目录结构看下,整个demo示例项目,主要有3个地方注意,控制器class、启动class,properties配置文件
文件说明:
SolrApplication.java //启动类
SolrController.java //基于solr的增删改查的web请求方法和示例
application-dev.properties //项目相关配置,前提是application.properties里面环境应当配置为dev
另外项目中用的是logback日志插件,下面代码中如果你的环境没有用到,那把所有的log替换成syso输出即可。
3.主要功能源码
SolrApplication.java
package com.hornet;
import org.springframework.boot.SpringApplication;
import org.springframework.boot.autoconfigure.SpringBootApplication;
/**
* solr后台服务demo启动入口
*
* @author avatar
* @since 2019年4月23日 下午3:15:15
*/
@SpringBootApplication
public class SolrApplication {
/**
* 程序入口
*
* @param args
*/
public static void main(String[] args) {
SpringApplication.run(SolrApplication.class);
}
}
SolrController.java
package com.hornet.solr.web;
import java.util.List;
import java.util.Map;
import java.util.UUID;
import org.apache.solr.client.solrj.SolrClient;
import org.apache.solr.client.solrj.SolrQuery;
import org.apache.solr.client.solrj.response.QueryResponse;
import org.apache.solr.common.SolrDocument;
import org.apache.solr.common.SolrDocumentList;
import org.apache.solr.common.SolrInputDocument;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RestController;
/**
* solr增删改查demo控制器
*
* @author avatar
* @since 2019年4月23日 下午3:21:46
*/
@RestController
@RequestMapping("/solr")
public class SolrController {
/** 日志记录 */
private static final Logger log = LoggerFactory.getLogger(SolrController.class);
@Autowired
private SolrClient client;
/**
* 新增或者修改索引,当id存在时为更新,如果id不存在则为新增
* @return
*/
@RequestMapping("addOrUpdate")
public String addOrUpdate() {
//不重复的UUID,当前现有数据从id=10开始
String uuid = UUID.randomUUID().toString().replaceAll("-", "");
try {
SolrInputDocument doc = new SolrInputDocument();
doc.setField("id", uuid);
doc.setField("name", "小医仙");
doc.setField("sex", 0);
doc.setField("address", "斗气大陆五大家族银城龙岛2008号");
doc.setField("isDeleted", 0);
//如果spring.data.solr.host里面配置到demo_core,那么这里就不需要传demo_core
client.add("demo_core", doc);
client.commit("demo_core");
log.info("新增/更新成功!");
return "新增/更新成功!";
} catch (Exception e) {
e.printStackTrace();
}
return null;
}
/**
* 根据id删除索引
*
* @param id
* @return
*/
@RequestMapping("delete")
public String delete(String id) {
try {
client.deleteById("demo_core",id);
client.commit("demo_core");
log.info("删除id=[{}]成功!",id);
return "删除成功!";
} catch (Exception e) {
e.printStackTrace();
}
return null;
}
/**
* 删除所有的索引
*
* @return
*/
@RequestMapping("deleteAll")
public String deleteAll(){
try {
client.deleteByQuery("demo_core","*:*");
client.commit("demo_core");
log.info("删除所有索引成功!");
return "删除所有索引成功!";
} catch (Exception e) {
e.printStackTrace();
}
return null;
}
/**
* 根据id查询索引
*
* @return
* @throws Exception
*/
@RequestMapping("getById")
public String getById(String id) throws Exception {
SolrDocument document = client.getById("demo_core", id);
log.info("根据id=[{}]查询索引成功!", id);
log.info("查询结果为:{}", document.toString());
return document.toString();
}
/**
* 综合查询:可以按照条件,排序,分页,高亮显示,部分域信息查询
*
* @return
*/
@RequestMapping("search")
public String search(String q){
try {
SolrQuery params = new SolrQuery();
//查询条件,q的对应值
params.set("q", q);
//过滤条件,可以增加多个多虑条件
//params.set("fq", "updateTime:[2019-04-19 08:10:59 TO 2019-04-19 09:10:59]");
//排序,不传默认排序
params.addSort("id", SolrQuery.ORDER.asc);
//分页参数
params.setStart(0);
params.setRows(20);
//默认域
params.set("df", "address");
//只查询指定域,指定显示字段
params.set("fl", "id,name,address");
//高亮
//打开开关
params.setHighlight(true);
//指定高亮域
params.addHighlightField("address");
//高亮css设置前缀
params.setHighlightSimplePre("<span style='background-color:yellow;'>");
//高亮css设置后缀
params.setHighlightSimplePost("</span>");
//高亮设置每个分片的最大长度
params.setHighlightFragsize(100000);
QueryResponse queryResponse = client.query("demo_core", params);
SolrDocumentList results = queryResponse.getResults();
long numFound = results.getNumFound();
log.info("查询结果数量为:{}条",numFound);
log.info("查询结果为:{}",results.toString());
//获取高亮显示的结果, 高亮显示的结果和查询结果是分开放的
Map<String, Map<String, List<String>>> highlight = queryResponse.getHighlighting();
log.info("查询结果高亮显示为:{}",highlight.toString());
// for (SolrDocument result : results) {
// Map<String, List<String>> map = highlight.get(result.get("id"));
// List<String> list = map.get("address");
// log.info(list.get(0));
// }
return results.toString();
} catch (Exception e) {
e.printStackTrace();
}
return null;
}
}
application.properties
spring.profiles.active=dev
application-dev.properties
#开发环境配置文件
#开发模式
debug=false
#指定server绑定的地址
server.address=127.0.0.1
#服务启动端口
server.port=9983
#solr服务配置
spring.data.solr.host=http://127.0.0.1:8983/solr
4.springboot项目配置完成,启动项目,测试工具使用postman,下面进行测试工作
4.1.新增/更新索引
请求地址:localhost:9983/solr/addOrUpdate
4.2.根据id查询索引
取4.1步骤插入的id值来查询,id=a6573f43864d49dba6ff4bcef3c1d2aa
请求地址:localhost:9983/solr/getById?id=a6573f43864d49dba6ff4bcef3c1d2aa
4.3.根据id删除索引
还是这条数据的id值来进行删除,id=a6573f43864d49dba6ff4bcef3c1d2aa
请求地址:localhost:9983/solr/delete?id=a6573f43864d49dba6ff4bcef3c1d2aa
4.4.删除所有索引(略)
4.5.综合查询
测试之前将小医仙的数据插入solr中方便测试,先看一下solr管理平台查到的数据:
我们共查出来4条数据,下面使用postman进行测试:
请求地址:localhost:9983/solr/search?q=address:大陆
高亮显示查询到的结果数据:
先看一下solr管理平台查到的高亮显示的数据:
高亮显示其实就是在查询出来的字段前后加上CSS高亮的代码,具体高亮的样式自由控制。
下面我们用postman测试,看代码中如何获取到高亮的数据:
localhost:9983/solr/search?q=address:大陆
还是发起这个请求,然后看下代码逻辑,这里会成功输出对应高亮数据:
到这里,springboot集成solr进行增删改查的常规测试操作就完成了。