Solr介绍
Solr具有高度的可靠性,可伸缩性和容错能力,可提供分布式索引,复制和负载平衡查询,自动故障转移和恢复,集中式配置等。Solr为许多世界上最大的互联网站点提供搜索和导航功能。
Solr是具有REST类API的独立企业搜索服务器。您可以通过JSON,XML,CSV或HTTP二进制文件将文档放入其中(称为“索引编制”)。您通过HTTP GET查询它,并接收JSON,XML,CSV或二进制结果。
先进的全文本搜索功能
在Lucene ™的支持下,Solr实现了强大的匹配功能,包括短语,通配符,联接,分组等等,跨任何数据类型
针对大流量进行了优化
Solr已在全球范围内得到广泛验证
基于标准的开放接口-XML,JSON和HTTP
Solr使用您用来使应用程序构建快速的工具
全面的管理界面
Solr附带内置的响应式管理用户界面,可轻松控制您的Solr实例
易于监控
需要深入了解您的实例吗?Solr通过JMX发布负载指标数据
高度可扩展和容错
Solr建立在经过实战检验的Apache Zookeeper之上,可以轻松地上下扩展。Solr开箱即用地进行复制,分发,重新平衡和容错。
灵活且适应性强,配置简单
Solr's旨在满足您的所有需求,同时简化配置
近实时索引
想立即查看您的更新吗?Solr利用Lucene的近实时索引功能来确保您在看到内容时能够看到它
可扩展的插件架构
Solr发布了许多定义明确的扩展点,这些扩展点使插入索引和查询时间插件变得容易。当然,由于它是Apache许可的开放源代码,因此您可以更改所需的任何代码!
安装
官网下载地址:http://lucene.apache.org/solr/downloads.html
下载速度可以快很多:https://download.csdn.net/download/tangcv/12084451
windows环境下载
我的是solr-7.7.2.zip版本,解压后
bin:solr的命令文件
contrib:solr的插件
dist: solr的jar包
docs: solr文档
example: solr示例
licenses: solr证书
server: solr服务器核心文件
配置环境变量方便启动:solr的bin目录
启动
solr start
不愿配置环境遍历的
//进入solr bin目录
solr.cmd start
其它命令
solr start –p 端口号 单机版启动solr服务(默认端口号8983)
solr restart –p 端口号 重启solr服务
solr stop –p 端口号关闭solr服务
打开网页http://localhost:8983访问进入solr页面即安装完成。
spring boot中使用
在solr页面创建core
solr create -c demo
此时在solr目录下会生成一个demo文件:
进入conf目录下:
在Solr的配置文件里,有两个文件很重要,一个是solrconfig.xml
,还有一个就是schema.xml,
Solr版本中(Solr5之前),在创建core的时候,Solr会自动创建好schema.xml,在之后的版本中,生成的managed-schema就是schema.xml,直接把managed-schema文件重命名为schema.xml
基础配置完成
spring boot项目中增删改查数据
spring boot中添加solr依赖
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-data-solr</artifactId>
</dependency>
yml配置solr端口信息
spring:
data:
solr:
host: http://localhost:8983/solr/demo
添加实体类 UserSolr
import lombok.Data;
import org.apache.solr.client.solrj.beans.Field;
import java.io.Serializable;
/**
* @author :抽象书生
* @date :Created in 2020/1/6 9:34
* @Time: 9:34
* @description:搜素引擎实体类
* @modified By:
* @version: 1.0$
*/
@Data
public class UserSolr implements Serializable {
//必须实现可序列化接口,要在网络上传输
@Field("id")//使用这个注释,里面的名字是根据你在solr数据库中配置的来决定
private String id;
@Field("item_name")
private String name;
@Field("item_sex")
private String sex;
@Field("item_address")
private String address;
@Field("item_host")
private Integer host;
}
SolrService
public interface SolrService {
List<UserSolr> addUser();
}
SolrServiceImpl
@Service
public class SolrServiceImpl implements SolrService {
@Override
public List<UserSolr> addUser() {
List<UserSolr> list = new ArrayList<>();
UserSolr user = new UserSolr();
for (int i = 0; i <5 ; i++) {
user.setId(UUID.randomUUID().toString().replace("-",""));
user.setName("jack"+i);
if( i % 2 ==0) {
user.setSex("男");
}else {
user.setSex("女");
}
user.setAddress("兰州市安宁区666"+i);
user.setHost(73040+i);
list.add(user);
}
return list;
}
}
SolrController
import io.swagger.annotations.Api;
import io.swagger.annotations.ApiOperation;
import lombok.extern.slf4j.Slf4j;
import me.zhengjie.aop.log.Log;
import me.zhengjie.domain.UserSolr;
import me.zhengjie.service.SolrService;
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.client.solrj.response.UpdateResponse;
import org.apache.solr.common.SolrDocument;
import org.apache.solr.common.SolrDocumentList;
import org.apache.solr.common.util.NamedList;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Component;
import org.springframework.stereotype.Controller;
import org.springframework.web.bind.annotation.*;
import java.io.IOException;
import java.util.Collection;
import java.util.List;
import java.util.Map;
@Slf4j
@Controller
@RequestMapping("/api/solr")
@Api(tags = "工具:搜索引擎")
@Component
public class SolrController {
@Autowired
private SolrService solrService;
@Autowired
private SolrClient solrClient;
//批量增加
@GetMapping("/addUsers")
@Log("批量增加")
@ApiOperation("批量增加")
@ResponseBody
public void addUsers() throws IOException, SolrServerException {
List<UserSolr> users = solrService.addUser();
solrClient.addBeans(users);
solrClient.commit();
}
//单个增加
@GetMapping("/addUser")
@Log("单个增加")
@ApiOperation("单个增加")
@ResponseBody
public void addUser() throws IOException, SolrServerException {
UserSolr user = new UserSolr();
user.setId("456788");
user.setName("王强");
user.setAddress("北京市");
user.setSex("女");
user.setHost(456752);
solrClient.addBean(user);
solrClient.commit();
}
//根据di查询
@GetMapping("/getByIdFromSolr/{id}")
@Log("根据di查询")
@ApiOperation("根据di查询")
@ResponseBody
public void getByIdFromSolr(@PathVariable("id") String id) throws IOException, SolrServerException {
//根据id查询内容
SolrDocument solrDocument = solrClient.getById(id);
//获取filedName
Collection<String> fieldNames = solrDocument.getFieldNames();
//获取file名和内容
Map<String, Object> fieldValueMap = solrDocument.getFieldValueMap();
// int childDocumentCount = solrDocument.getChildDocumentCount();
List<SolrDocument> childDocuments = solrDocument.getChildDocuments();
System.out.println("byId=================="+solrDocument);
System.out.println("fieldNames=================="+fieldNames);
System.out.println("fieldValueMap=================="+fieldValueMap);
// System.out.println("childDocumentCount=================="+childDocumentCount);
System.out.println("childDocuments=================="+childDocuments);
}
//根据di删除
@DeleteMapping("/delById/{id}")
@Log("根据di删除")
@ApiOperation("根据di删除")
@ResponseBody
public void delById(@PathVariable("id") String id) throws IOException, SolrServerException {
//根据id删除信息
UpdateResponse updateResponse = solrClient.deleteById(id);
//执行的时间
long elapsedTime = updateResponse.getElapsedTime();
int qTime = updateResponse.getQTime();
//请求地址
String requestUrl = updateResponse.getRequestUrl();
//请求的结果{responseHeader={status=0,QTime=2}}
NamedList<Object> response = updateResponse.getResponse();
//请求结果的头{status=0,QTime=2}
NamedList responseHeader = updateResponse.getResponseHeader();
//请求的状态 0
int status = updateResponse.getStatus();
System.out.println("elapsedTime==========="+elapsedTime);
System.out.println("qTime==========="+qTime);
System.out.println("requestUrl==========="+requestUrl);
System.out.println("response==========="+response);
System.out.println("responseHeader==========="+responseHeader);
System.out.println("status==========="+status);
}
@GetMapping("/queryFromSolr")
@Log("queryFromSolr")
@ApiOperation("queryFromSolr")
public Object queryFromSolr() throws IOException, SolrServerException {
//第一种方式
// Map<String, String> queryParamMap = new HashMap<String, String>();
// queryParamMap.put("q", "*:*");
// queryParamMap.put("f1","id,name");
// queryParamMap.put("sort","id asc");
// MapSolrParams mapSolrParams = new MapSolrParams(queryParamMap);
// solrClient.query(mapSolrParams);
//第二种方式
SolrQuery solrQuery = new SolrQuery();
solrQuery.setQuery("*:*");
// solrQuery.addField("*");
solrQuery.add("q","id:4567");
solrQuery.setSort("id", SolrQuery.ORDER.asc);
//设置查询的条数
solrQuery.setRows(50);
//设置查询的开始
solrQuery.setStart(0);
//设置高亮
solrQuery.setHighlight(true);
//设置高亮的字段
solrQuery.addHighlightField("item_name");
//设置高亮的样式
solrQuery.setHighlightSimplePre("<font color='red'>");
solrQuery.setHighlightSimplePost("</font>");
System.out.println(solrQuery);
QueryResponse response = solrClient.query(solrQuery);
//返回高亮显示结果
Map<String, Map<String, List<String>>> highlighting = response.getHighlighting();
//response.getResults();查询返回的结果
SolrDocumentList documentList = response.getResults();
for (SolrDocument solrDocument : documentList) {
System.out.println("solrDocument==============" +solrDocument);
}
return documentList;
}
}
开始测试:
单个增加:
成功
批量增加
根据di删除
根据di查询
本文参考:http://lucene.apache.org/solr/
本文参考:https://blog.csdn.net/weixin_42129558/article/details/82682265