一篇教程:https://blog.youkuaiyun.com/awj3584/article/details/16963525
官网下载solr-8.1.1,配置solr,搭建服务器
参考:https://blog.youkuaiyun.com/qq_40202111/article/details/80654876Solr
https://blog.youkuaiyun.com/Cs_hnu_scw/article/details/79388080
Solr
启动服务,访问http://localhost:8080/solr/index.html#/
添加Core
添加文件索引
数据库索引
managed-schema配置分词
Springboot + Layui
pom.xml
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-data-solr</artifactId>
</dependency>
<dependency>
<groupId>org.apache.solr</groupId>
<artifactId>solr-solrj</artifactId>
<version>8.1.1</version>
</dependency>
<dependency>
<groupId>org.mybatis.spring.boot</groupId>
<artifactId>mybatis-spring-boot-starter</artifactId>
<version>2.0.1</version>
</dependency>
<dependency>
<groupId>com.alibaba</groupId>
<artifactId>fastjson</artifactId>
<version>1.2.52</version>
</dependency>
<dependency>
<groupId>log4j</groupId>
<artifactId>log4j</artifactId>
<version>1.2.17</version>
</dependency>
<dependency>
<groupId>mysql</groupId>
<artifactId>mysql-connector-java</artifactId>
<version>5.1.46</version>
</dependency>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-web</artifactId>
</dependency>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-thymeleaf</artifactId>
</dependency>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-test</artifactId>
<scope>test</scope>
</dependency>
<dependency>
<groupId>junit</groupId>
<artifactId>junit</artifactId>
<version>4.12</version>
</dependency>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-test</artifactId>
<version>2.1.5.RELEASE</version>
</dependency>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-devtools</artifactId>
<optional>true</optional>
</dependency>
<dependency>
<groupId>org.springframework</groupId>
<artifactId>spring-test</artifactId>
<version>5.1.7.RELEASE</version>
<scope>compile</scope>
</dependency>
项目中添加的还有其他功能,引用的较多
application.yml
spring:
datasource:
driver-class-name: com.mysql.jdbc.Driver
url: jdbc:mysql://127.0.0.1:3306/test
username: root
password: root
thymeleaf:
prefix: classpath:/templates/
server:
port: 8081
solr:
httpSolrClient: http://127.0.0.1:8080/solr/
solr.html
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8">
<title>solr</title>
<link rel="stylesheet" href="/layui/css/layui.css" />
<script src="/layui/layui.js"></script>
</head>
<body>
<div class="layui-container" id="block">
<div class="layui-row" style="padding-top: 2vw;">
<div class="layui-inline">
<input type="text" id="mh" placeholder="请输入..." class="layui-input">
</div>
<button class="layui-btn" id="ss">
<i class="layui-icon layui-icon-search"></i>搜索
</button>
</div>
<table class="table layui-table" id="tbs" lay-filter="demo">
</table>
</div>
<script src="js/choice.js"></script>
</body>
</html>
choice.js
layui.use(['table','element',"jquery",'layer','form','upload'], function(){
var table = layui.table
,$=layui.$
,form=layui.form
,layer = layui.layer
,upload=layui.upload
,element = layui.element; //元素操作
//加载数据
var s=$("#mh").val();
table.render({
elem: '#tbs'
/* ,height: 400 */ //不填写将随每页数据大小调整高度
,url: 'MovieSolrTest?str='+s //数据接口
,limits : [8,10,15,20]
,limit : 8
,page: true //开启分页
,id:'tbs'
/* , initSort: {
field: 'createDatetime' //排序字段,对应 cols 设定的各字段名
, type: 'desc' //排序方式 asc: 升序、desc: 降序、null: 默认排序
} */
,cols: [[
{type:'checkbox',fixed:"left", align:"center"}
,{field: 'm_id', title:'ID', width:80, align:"center"}
,{field: 'username', title:'用户名', width:100,align:"center"}
,{field: 'movie_name', title:'电影名' ,minWidth: 100, align:'center'}
,{field: 'yingping', title:'影评' , minWidth: 100, align:'center'}
,{field: 'dianzan', title:'点赞' , width: 100, align:'center'}
]]
});
$('#ss').on('click', function () {
// 搜索条件
var s=$("#mh").val();
table.reload('tbs', {
method: 'post'
, where: {
'str': s
}
, page: {
curr: 1
}
});
});
});
bean 省略get和set
public class moviecore implements Serializable {
@Id
@Field
private int m_id;
@Field
private String id;
@Field
private String username;
@Field
private String movie_name;
@Field
private String dianzan;
@Field
private String yingping;
}
}
service
@Service
public class SolrService {
private Logger logger = LoggerFactory.getLogger(SolrService.class);
@Value("${solr.httpSolrClient}")
private String httpSolrClient; /* application.yml中保存的数据 http://127.0.0.1:8080/solr/ */
private static SolrClient solr;
public HttpSolrClient connetHttpSolrClientServer(String coreName){
HttpSolrClient server = new HttpSolrClient.Builder(httpSolrClient + coreName).build();
return server;
}
}
controller
public class MovieSolr {
private static Logger log = Logger.getLogger(MovieSolr.class); //日志
@Autowired
private SolrClient solrClient;
@Autowired
private SolrService solrService;
@RequestMapping("/solr")
public String helloHtml() {
return "solr";
}
@RequestMapping("MovieSolrTest")
@ResponseBody
public Map<String, Object> SolrTest(String page,String limit,String str) {
solrClient=solrService.connetHttpSolrClientServer("moviecore");
Map<String, Object> result = new HashMap<>();
SolrQuery query = new SolrQuery();
query.setSort("_version_", SolrQuery.ORDER.asc); //设置排序参数及排序规则
int startPage = Integer.valueOf(page);
int pageNum = Integer.valueOf(limit);
query.setStart((startPage - 1) * pageNum);
query.setRows(pageNum);
StringBuffer buffer = new StringBuffer();
if (("").equals(str)) {
query.set("q", "*:*"); //没有传入参数则全部查询
}
else if ((",").equals(str)) {
query.set("q", "*:*"); //没有传入参数则全部查询
}
else if(str.substring(0,1).equals(",")&&str.length()>1) {
str = str.substring(1, str.length());
buffer.append("movie_name:" + str+" OR "+"username:"+str+" OR "+"yingping:"+str); //如果你的字段在solrHome/moviecore/conf/manage-schema文件中定义的类型是text_ik,即已经分词了,那么这里可以这么写,如果你定义的是string类型,即没有分词,那这句话的append中的内容需要写成这样buffer.append("fbfmc:*"+fbfmc+"*"),这是solr的查询规则,没有分词最好是加上模糊查询符号"*"
query.set("q", buffer.toString());
}
//query.set("fl","id,movie_name,username,yingping,dianzan,m_id");
query.set("df","movie_name");
//高亮
//打开开关
query.setHighlight(true);
//指定高亮域
query.addHighlightField("movie_name,username,yingping");
//设置前缀
query.setHighlightSimplePre("<span style='color:red'>");
//设置后缀
query.setHighlightSimplePost("</span>");
//执行查询
QueryResponse rsp = null;
try {
rsp = solrClient.query(query);
} catch (Exception e) {
log.error(e.getMessage());
}
//取查询结果集
SolrDocumentList results = rsp.getResults();
//查询总条数
//log.info(results.getNumFound());
//该方法将返回结果转换为对象,很方便。
//List<moviecore> movieList = rsp.getBeans(moviecore.class);
Map<String, Map<String, List<String>>> highlight = rsp.getHighlighting();
List<SolrDocument> list = new ArrayList<>();
for (SolrDocument solrDocument : results) {
if(highlight!=null){ // 解析高亮查询结果
Map<String, List<String>> map = highlight.get(solrDocument.get("id").toString()); //根据文本id解析Map
if(map!=null){
for(String key:map.keySet()){ // 遍历map的key值获取设置的
if(solrDocument.containsKey(key)){ // 判断文本中是否包含该值
List<String> listHigth = map.get(key); // 包含则得到 高亮数据集合
if(null!=listHigth && listHigth.size()>0){
String str1="";
for(String value:listHigth){ // 对集合数据进行拼接
str1+=value;
}
solrDocument.setField(key, str1); // 替换到原不是高亮显示的部分
}
}
}
}
}
list.add(solrDocument);
}
result.put("code", 0);
result.put("msg", "");
result.put("count", results.getNumFound());
result.put("data", list);
return result;
}
页面
结果