一、使用docker命令查看solr版本(也可以去docker仓库查看:https://hub.docker.com/_/solr/)
docker search solr
二、可以拉取对应版本(我这使用的版本是8.11.1)
docker pull solr:8.11.1
三、创建my_solr容器
docker run --name my_solr -d -p 8983:8983 solr:8.11.1
run 运行容器
– name 容器名称
-d 后台运行
-p 容器端口和宿机端口映射
solr:8.11.1 指镜像名称
四、创建solr核心命令
1.创建solr核心
//创建名为my_core的核心
docker exec -it --user=solr my_solr bin/solr create -c my_core
//删除核心命令
docker exec -it --user=solr my_solr bin/solr delete -c my_core
2.修改solr.in.sh.orig权限(可选)
如果你的solr使用的是root启动,solr初始化检查时会报一些警告信息,最重要的是在使用solr时,因为是root用户,无权限操作,服务器的内存会被大量占用,严重时会导致OOM问题。
//1.此文件位置在/opt/solr/bin目录下
//进入solr容器
docker exec -it -u root my_solr /bin/bash
cd /opt/solr/bin
//安装vim命令:apt-get install vim(如果提示:Unable to locate package vim,则需要敲:apt-get update)
//等更新完毕以后再敲命令: apt-get install vim
vim solr.in.sh.orig
//找到SOLR_ULIMTIT_CHECKS行,默认为true,这里改为false
SOLR_ULIMTIT_CHECKS=false

五、访问浏览器
127.0.0.1:8983/solr (自己的ip + 端口 + /solr)
标红框的地方就是刚刚创建的核心
六、solr配置中文分词器:下载Ik文件(永久有效)
链接:https://pan.baidu.com/s/1CeiClqDfV_Ye93V9onG1xw 提取码:hgvc
//创建Ik文件夹
mkdir /Ik
将解压的文件放置到创建的文件中(文件名随便取,我这里是Ik)
七、将下载的ik文件拷贝至sorl容器中
//将jar包拷贝到solr的lib目录下
docker cp ik-analyzer-8.3.0.jar my_solr:/opt/solr-8.11.1/server/solr-webapp/webapp/WEB-INF/lib/
docker cp ik-analyzer-solr7-7.x.jar my_solr:/opt/solr-8.11.1/server/solr-webapp/webapp/WEB-INF/lib/
docker cp solr-dataimporthandler-8.4.0.jar my_solr:/opt/solr-8.11.1/server/solr-webapp/webapp/WEB-INF/lib/
docker cp solr-dataimporthandler-extras-8.4.0.jar my_solr:/opt/solr-8.11.1/server/solr-webapp/webapp/WEB-INF/lib/
八、进入容器修改managed-schema
//进入solr容器
docker exec -it -u root my_solr /bin/bash
//进入到conf目录
cd /var/solr/data/my_core/conf
//修改managed-schema(注:如果没有安装vim命令,在虚拟机安装即可。)
//安装vim命令:apt-get install vim(如果提示:Unable to locate package vim,则需要先输入此命令:apt-get update)
//等更新完毕以后再敲命令: apt-get install vim
vim managed-schema
将以下内容添加至managed-schema文件中
<!-- ik分词器 -->
<fieldType name="text_ik" class="solr.TextField">
<analyzer type="index">
//useSmart:分词粗细粒度(true:粗分词 false:细分词)
<tokenizer class="org.wltea.analyzer.lucene.IKTokenizerFactory" useSmart="false" conf="ik.conf"/>
<filter class="solr.LowerCaseFilterFactory"/>
</analyzer>
<analyzer type="query">
<tokenizer class="org.wltea.analyzer.lucene.IKTokenizerFactory" useSmart="true" conf="ik.conf"/>
<filter class="solr.LowerCaseFilterFactory"/>
</analyzer>
</fieldType>
<fieldType name="text_cn" class="solr.TextField">
<analyzer type="index">
<tokenizer class="org.wltea.analyzer.lucene.IKTokenizerFactory" useSmart="true" conf="ik.conf"/>
<filter class="solr.LowerCaseFilterFactory"/>
</analyzer>
<analyzer type="query">
<tokenizer class="org.wltea.analyzer.lucene.IKTokenizerFactory" useSmart="true" conf="ik.conf"/>
<filter class="solr.LowerCaseFilterFactory"/>
</analyzer>
</fieldType>
<!-- 定义两个字段 -->
//name:名字随便取 type:分词的类型 indexed:是否建立索引 stored:是否储存到硬盘
<field name="zh_ik" type="text_ik" indexed="true" stored="true" />
<field name="zh_cn" type="text_cn" indexed="true" stored="true" />
九、保存并退出容器
//退出容器
exit
//重启容器
docker restart my_solr
十、测试ik分词器是否安装成功
在界面中看到text_cn就表示中文分词器配置完成
十一、sorl控制台新增、修改、删除、查询操作
1.新增、修改
2.删除(两种方式)
第一种:根据唯一id删除
第二种:根据查询的内容删除
3.查询
4.高亮中的参数说明
十二、springboot集成sorl的增删改查操作(两种方式)方式一
1.导入solr依赖
<!--引入solr库连接jar-->
<dependency>
<groupId>org.apache.solr</groupId>
<artifactId>solr-solrj</artifactId>
<version>8.11.1</version>
</dependency>
2.增/改操作
/**
* solr添加或修改数据
*/
@Test
public void testSolr(){
String url="http://自己的solr ip地址:8983/solr/my_core";
HttpSolrClient client=new HttpSolrClient.Builder(url).build();
try {
//新增或更新,文档类型都是SolrInputDocument
SolrInputDocument inputFields=new SolrInputDocument();
inputFields.addField("id","007");
inputFields.addField("zh_cn","idea测试连接solr数据");
//response:新增或修改的返回结果
UpdateResponse response = client.add(inputFields);
System.out.println("solr返回状态:"+response.getStatus());
System.out.println("solr运行时间:"+response.getQTime());
//提交请求
client.commit();
//关闭资源
client.close();
} catch (IOException | SolrServerException e) {
e.printStackTrace();
//如果出现异常,在solr中是有事务可以进行控制
try {
//出现异常,对数据进行回滚
client.commit();
} catch (IOException | SolrServerException ioException) {
ioException.printStackTrace();
}
}
}

3.删除操作
/**
* 删除solr数据
*/
@Test
public void testSolrDelete(){
String url="http://自己的solr ip地址:8983/solr/my_core";
HttpSolrClient client=new HttpSolrClient.Builder(url).build();
try {
//根据id删除
UpdateResponse response = client.deleteById("001");
//根据索引数据查询删除(查询出和天气的所有数据,并全部删除)
//UpdateResponse response = client.deleteByQuery("天气");
System.out.println("solr返回状态:"+response.getStatus());
System.out.println("solr运行时间:"+response.getQTime());
//提交请求
client.commit();
//关闭资源
client.close();
} catch (IOException | SolrServerException e) {
e.printStackTrace();
//如果出现异常,在solr中是有事务可以进行控制
try {
//出现异常,对数据进行回滚
client.commit();
} catch (IOException | SolrServerException ioException) {
ioException.printStackTrace();
}
}
}
id为001的数据删除成功
4.查询操作
/**
* 查询solr数据
*/
@Test
public void testSolrSelect(){
String url="http://自己的solr ip地址:8983/solr/my_core";
HttpSolrClient client=new HttpSolrClient.Builder(url).build();
try {
//查询字段
SolrQuery params= new SolrQuery();
//查询条件
params.setQuery("zh_cn:天气");
//分页
//params.setStart(0);
//params.setRows(10);
//排序
//params.setSort("id", SolrQuery.ORDER.desc);
QueryResponse query = client.query(params);
//获取查询数据(包含numFound、start、numFoundExact、docs)
SolrDocumentList results = query.getResults();
System.out.println("总计行数:"+results.getNumFound());
for (SolrDocument result : results) {
System.out.print("id="+result.getFieldValue("id"));
System.out.println(";zh_cn="+result.getFieldValue("zh_cn"));
}
//提交请求
client.commit();
//关闭资源
client.close();
} catch (IOException | SolrServerException e) {
e.printStackTrace();
//如果出现异常,在solr中是有事务可以进行控制
try {
//出现异常,对数据进行回滚
client.commit();
} catch (IOException | SolrServerException ioException) {
ioException.printStackTrace();
}
}
}
控制台输出
十三、springboot集成sorl的增删改查操作(两种方式)方式二
1.导入solr依赖
<!-- 使用springboot-data封装的solr依赖 -->
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-data-solr</artifactId>
</dependency>
配置文件添加solr
2.增/改操作(两种方式)
/**
* solr添加或修改数据(方式一)
*/
@Test
public void testSolr(){
//saveDocument:构建SolrInputDocument添加单条数据
SolrInputDocument inputFields=new SolrInputDocument();
inputFields.addField("id","008");
inputFields.addField("zh_cn","springbootData添加测试数据...");
//参数1:String collection(添加到那个核心) 参数2:SolrInputDocument document(构建的单条数据)
solrTemplate.saveDocument("my_core",inputFields);
//saveDocuments:构建SolrInputDocument添加批量数据
//solrTemplate.saveDocuments(String collection(添加到solr的那个核心),List<SolrInputDocument> document(构建的批量数据));
//提交
solrTemplate.commit("my_core");
//事务管理
solrTemplate.rollback("my_core");
}
添加单条成功查询结果
/**
* solr添加或修改数据(方式2)
*/
@Test
public void testSolr2(){
//POJO添加单条数据
//solrTemplate.saveBean();
//POJO批量添加数据
//参数1:String collection(添加到solr的那个核心) 参数2:Collection<?> beans(pojo对象集合数据)
SolrTemplatePojo pojo1=new SolrTemplatePojo();
pojo1.setId("009");
pojo1.setZh_cn("使用beans批量添加测试数据1...");
SolrTemplatePojo pojo2=new SolrTemplatePojo();
pojo2.setId("010");
pojo2.setZh_cn("使用beans批量添加测试数据2...");
SolrTemplatePojo pojo3=new SolrTemplatePojo();
pojo3.setId("011");
pojo3.setZh_cn("使用beans批量添加测试数据3...");
List<SolrTemplatePojo> list=new ArrayList<>();
list.add(pojo1);
list.add(pojo2);
list.add(pojo3);
solrTemplate.saveBeans("my_core",list);
//提交
solrTemplate.commit("my_core");
//事务管理
solrTemplate.rollback("my_core");
}
pojo类
@Data
@SolrDocument
public class SolrTemplatePojo {
@Id
private String id;
@Field
private String zh_cn;
}
使用beans批量添加查询结果
3.删除操作
/**
* 删除solr数据
*/
@Test
public void testSolrDelete(){
solrTemplate.deleteByIds("my_core","002");
solrTemplate.commit("my_core");
}
4.查询操作
/**
* 查询solr数据
*/
@Test
public void testSolrSelect(){
//构建查询条件:查询zh_cn字段,条件为beans
Criteria criteria = Criteria.where("zh_cn").is("beans");
Query query=Query.query(criteria);
//升、降排序 这里根据id倒序排序
//query.addSort(Sort.by(Sort.Direction.DESC,"id"));
//分页
//query.setPageRequest(PageRequest.of(0,10));
//也可以将分页、排序写一起
query.setPageRequest(PageRequest.of(0,10,Sort.by(Sort.Direction.DESC,"id")));
//String collection(查询solr中的那个核心库数据) Query query(查询条件) Class<T> clazz(接收查询的结果对象)
ScoredPage<SolrTemplatePojo> core = solrTemplate.queryForPage("my_core", query, SolrTemplatePojo.class);
System.out.println("size:"+core.getSize());
System.out.println("number:"+core.getNumber());
for (SolrTemplatePojo pojo : core) {
System.out.println(pojo);
}
}
查询结果
/**
* 高亮查询solr数据
*/
@Test
public void testSolrSelect2(){
//构建查询条件:查询zh_cn字段,条件为beans
HighlightQuery query=new SimpleHighlightQuery();
//设置查询条件
query.addCriteria(Criteria.where("zh_cn").is("beans"));
//也可以将分页、排序写一起
query.setPageRequest(PageRequest.of(0,10));
//设置高亮数据
HighlightOptions h=new HighlightOptions();
//给那个字段设置高亮显示
h.addField("zh_cn");
//设置前缀
h.setSimplePrefix("<p>");
//设置后缀
h.setSimplePostfix("</p>");
query.setHighlightOptions(h);
HighlightPage<SolrTemplatePojo> core = solrTemplate.queryForHighlightPage("my_core", query, SolrTemplatePojo.class);
List<HighlightEntry<SolrTemplatePojo>> highlighted = core.getHighlighted();
highlighted.forEach(entry->{
List<HighlightEntry.Highlight> highlights = entry.getHighlights();
highlights.forEach(highlight->{
System.out.println("高亮数据:"+highlight.getSnipplets());
});
});
}

十四、搭建solr集群(后期补…)
十五、solr导入数据库数据配置(这里有版本问题,如果你的solr版本高于8.6.0,这个功能官方不推荐使用了,后期可能会被移除)
1.将以下内容添加至solrconfig.xml文件最下面
vim solrconfig.xml
//编写solr和mysql的映射关系
<requestHandler name="/dataimport" class="org.apache.solr.handler.dataimport.DataImportHandler">
<lst name="defaults">
<str name="config">db-dataConfig.xml</str>
</lst>
</requestHandler>
2.创建名为db-dataConfig.xml文件,将以下内容添加到xml文件中(注意:mysql填写自己的账户和密码)
<?xml version="1.0" encoding="UTF-8" ?>
<dataConfig>
<!--
配置数据源:
driver :数据库驱动
url :数据库连接
user :数据库用户
password :数据库密码
-->
<dataSource type="JdbcDataSource" driver="com.mysql.jdbc.Driver" url="jdbc:mysql://自己的数据库ip地址:3306/user" user="root" password="123456" />
<document>
<!--
配置数据表:
name :实体对应表名
query :全部导入语句
-->
<entity
name="item"
query="SELECT id,title FROM `item`">
<!--
配置数据域:
column :数据库中字段的名称,特别要注意,name="id"中的id才是solr内置的域名,本配置其余id均为数据库字段主键id
name :solr普通域的字段名
-->
<field column="id" name="id" />
<field column="title " name="text_cn" />
</entity>
</document>
</dataConfig>
3.拷贝solr连mysql的驱动jar包
//1.将mysql驱动jar包拷贝至my_solr容器中的lib目录下(需要找到自己的mysql驱动jar包位置)
docker cp mysql-connector-java-5.1.23-bin.jar my_solr:/opt/solr-8.11.1/server/solr-webapp/webapp/WEB-INF/lib/
//2.进入容器docker exec -it -u root my_solr /bin/bash
cp /opt/solr-8.11.1/dist/solr-dataimporthandler-8.11.1.jar /opt/solr-8.11.1/server/solr-webapp/webapp/WEB-INF/lib/
//3.
cp /opt/solr-8.11.1/dist/solr-dataimporthandler-extras-8.11.1.jar /opt/solr-8.11.1/server/solr-webapp/webapp/WEB-INF/lib/
如果没有拷贝,lib目录下是没有这个三个jar包的
4.导入数据