个人学习SpringBoot系列 Solr篇
Github Link: https://github.com/panjianlong13/SpringBoot-SpringCloud/tree/master/spring-boot-solr-base
Solr介绍
Solr 是什么
Solr是一个独立的企业级搜索应用服务器,它对外提供类似于Web-service的API接口。用户可以通过http请求,向搜索引擎服务器提交一定格式的XML文件,生成索引;也可以通过Http Get操作提出查找请求,并得到XML格式的返回结果。
Solr是一个高性能,采用Java5开发,基于Lucene的全文搜索服务器。Solr部署方式有单机方式、多机Master-Slaver方式、Cloud方式。SolrCloud是基于Solr和Zookeeper的分布式搜索方案。当索引越来越大,一个单一的系统无法满足磁盘需求,查询速度缓慢,此时就需要分布式索引。在分布式索引中,原来的大索引,将会分成多个小索引,solr可以将这些小索引返回的结果合并,然后返回给客户端。
为什么要使用solr:
1、solr是将整个索引操作功能封装好了的搜索引擎系统(企业级搜索引擎产品)
2、solr可以部署到单独的服务器上(WEB服务),它可以提供服务,我们的业务系统就只要发送请求,接收响应即可,降低了业务系统的负载
3、solr部署在专门的服务器上,它的索引库就不会受业务系统服务器存储空间的限制
4、solr支持分布式集群,索引服务的容量和能力可以线性扩展
Solr 工作方式
文档通过Http利用XML 加到一个搜索集合中。查询该集合也是通过http收到一个XML/JSON响应来实现。它的主要特性包括:高效、灵活的缓存功能,垂直搜索功能,高亮显示搜索结果,通过索引复制来提高可用性,提供一套强大Data Schema来定义字段,类型和设置文本分析,提供基于Web的管理界面等。
Solr环境搭建(Mac)
## 安装Solr
brew install solr
## 安装成功之后启动
solr start
solr 的默认端口是8983
,我们在浏览器中输入 http://localhost:8983/solr/
新建SpringBoot项目
在pom.xml中添加依赖
SolrController
package com.peter.springboot.solr.controller;
import java.io.IOException;
import java.text.SimpleDateFormat;
import java.util.Date;
import java.util.HashMap;
import java.util.List;
import java.util.Map;
import org.apache.solr.client.solrj.SolrClient;
import org.apache.solr.client.solrj.SolrQuery;
import org.apache.solr.client.solrj.SolrServerException;
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.springframework.beans.factory.annotation.Autowired;
import org.springframework.web.bind.annotation.DeleteMapping;
import org.springframework.web.bind.annotation.GetMapping;
import org.springframework.web.bind.annotation.PathVariable;
import org.springframework.web.bind.annotation.PostMapping;
import org.springframework.web.bind.annotation.PutMapping;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RestController;
import springfox.documentation.swagger2.annotations.EnableSwagger2;
@RestController
@RequestMapping("/test")
@EnableSwagger2
public class SolrController {
@Autowired
private SolrClient client;
/**
* 1、增
*
* @param message
* @return
* @throws IOException
* @throws SolrServerException
*/
@PostMapping("/insert")
public String insert(String message) throws IOException, SolrServerException {
SimpleDateFormat sdf = new SimpleDateFormat("yyyyMMddhhmmss");
String dateString = sdf.format(new Date());
try {
SolrInputDocument doc = new SolrInputDocument();
doc.setField("id", dateString);
doc.setField("text", message);
/*
* 如果 spring.data.solr.host 里面配置到 core了, 那么这里就不需要传 collection1 这个参数 下面都是一样的 即
* client.commit();
*/
client.add("test", doc);
client.commit("test");
return dateString;
} catch (Exception e) {
e.printStackTrace();
}
return "error";
}
/**
* 2、查 id
*
* @param id
* @return
* @throws SolrServerException
* @throws IOException
*/
@GetMapping("/get/{id}")
public String getDocumentById(@PathVariable String id) throws SolrServerException, IOException {
SolrDocument document = client.getById("test", id);
System.out.println(document);
return document.toString();
}
/**
* 3、删 id
*
* @return
*/
@DeleteMapping("/delete/{id}")
public String getAllDocuments(@PathVariable String id) {
try {
client.deleteById("itaem", id);
client.commit("itaem");
return id;
} catch (Exception e) {
e.printStackTrace();
}
return "error";
}
/**
* 4、删 all
*
* @return
*/
@DeleteMapping("deleteAll")
public String deleteAll() {
try {
client.deleteByQuery("itaem", "*:*");
client.commit("itaem");
return "success";
} catch (Exception e) {
e.printStackTrace();
}
return "error";
}
/**
* 5、改
*
* @param message
* @return
* @throws IOException
* @throws SolrServerException
*/
@PutMapping("/update")
public String update(String id, String message) throws IOException, SolrServerException {
try {
SolrInputDocument doc = new SolrInputDocument();
doc.setField("id", id);
doc.setField("text", message);
/*
* 如果 spring.data.solr.host 里面配置到 core了, 那么这里就不需要传 itaem 这个参数 下面都是一样的 即
* client.commit();
*/
client.add("itaem", doc);
client.commit("itaem");
return doc.toString();
} catch (Exception e) {
e.printStackTrace();
}
return "error";
}
/**
* 6、全
*
* @return
* @throws SolrServerException
* @throws IOException
*/
@GetMapping("/get/all")
public Map<String, Object> getAll() throws SolrServerException, IOException {
Map<String, Object> map = new HashMap<String, Object>();
return map;
}
/**
* 7、查 ++:关键字、高亮、分页 ✔
*
* @return
* @return
* @throws SolrServerException
* @throws IOException
*/
@GetMapping("/select/{q}/{page}/{size}")
public Map<String, Object> select(@PathVariable String q, @PathVariable Integer page, @PathVariable Integer size)
throws SolrServerException, IOException {
SolrQuery params = new SolrQuery();
// 查询条件
params.set("q", q);
// 排序
params.addSort("id", SolrQuery.ORDER.desc);
// 分页
params.setStart(page);
params.setRows(size);
// 默认域
params.set("df", "text");
// 只查询指定域
params.set("fl", "id,text");
// 开启高亮
params.setHighlight(true);
// 设置前缀
params.setHighlightSimplePre("<span style='color:red'>");
// 设置后缀
params.setHighlightSimplePost("</span>");
// solr数据库是 itaem
QueryResponse queryResponse = client.query("itaem", params);
SolrDocumentList results = queryResponse.getResults();
// 数量,分页用
long total = results.getNumFound();// JS 使用 size=MXA 和 data.length 即可知道长度了(但不合理)
// 获取高亮显示的结果, 高亮显示的结果和查询结果是分开放的
Map<String, Map<String, List<String>>> highlight = queryResponse.getHighlighting();
Map<String, Object> map = new HashMap<String, Object>();
map.put("total", total);
map.put("data", highlight);
return map;
}
}
参数配置
插入数据
查询到插入的数据