docker安装solr、ik分词器及增删改查操作

一、使用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.导入数据
在这里插入图片描述


版权声明:本文为myisitz原创文章,遵循CC 4.0 BY-SA版权协议,转载请附上原文出处链接和本声明。