Solr使用

Posted 喔易

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了Solr使用相关的知识,希望对你有一定的参考价值。

一、安装(win

1、下载安装包

https://mirror.bit.edu.cn/apache/lucene/solr/ https://mirrors.bfsu.edu.cn/apache/lucene/solr/ https://mirrors.tuna.tsinghua.edu.cn/apache/lucene/solr/ 

解压压缩包,进入bin目录,执行启动命令。

启动命令:solr start

关闭命令:solr stop -all

重启solr solr restart –p p_num(默认端口号8983

 

2、基本配置

 

a创建核心文件夹(可以理解为数据库)

进入E:\demo\solr-8.5.2\solr-8.5.2\server\solr目录,创建my_db目录

b、将E:\demo\solr-8.5.2\solr-8.5.2\server\solr\configsets\sample_techproducts_configs目录下conf目录复制到my_db目录下。

c创建核心

浏览器访问 http://localhost:8983/solr

选择 Core Admin

右侧输入框的 name InstanceDir 输入my_db

 

将下载好的jar包放入E:\demo\solr-8.5.2\solr-8.5.2\server\solr-webapp\webapp\WEB-INF\lib 目录中libclasses目录不存在可以自己创建

2resources目录下的5个配置文件放入webapp/WEB-INF/classes/目录下

IKAnalyzer.cfg.xml

ext.dic

stopword.dic

ik.conf

dynamicdic.txt

3配置Solr的managed-schema,添加ik分词器:

  <!-- ik分词器 -->

<fieldType name="text_ik" class="solr.TextField">

<analyzer type="index">

<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>

4)重启solr,可以看到:

 

4、mysql导入数据

1)mysql-connector-java-xx.xx.xx.jar驱动包放到E:\demo\solr-8.5.2\solr-8.5.2\dist目录下

打开E:\demo\solr-8.5.2\solr-8.5.2\server\solr\my_db\conf2) solrconfig.xml文件修改添加

<lib dir="${solr.install.dir:../../../..}/dist/" regex="solr-dataimporthandler-.*\.jar" />

  <lib dir="${solr.install.dir:../../../..}/dist/" regex="mysql-connector-java-.*\.jar" />

 

<requestHandler name="/dataimport" class="org.apache.solr.handler.dataimport.DataImportHandler">

    <lst name="defaults">

        <str name="config">db-data-config.xml</str>

    </lst>

</requestHandler>

 

这里的name:/dataimport如果已经在其他core使用定义过,换个名称就可以了。

3) db-data-config.xml不存在可以自己创建,添加如下内容(字段根据自己需要设置)

<dataConfig>

    <dataSource driver="com.mysql.jdbc.Driver" url="jdbc:mysql://localhost:3306/xmall?serverTimezone=UTC" user="root" password="" />

    <document>

         <!-- document实体 -->

        <entity name="goods" query="SELECT * FROM xmall_goods">

            <!-- 数据库字段映射solr字段 -->

            <field column="goods_id" name="goodsId"/>

            <field column="goods_brief" name="goodsBrief"/>

            <field column="goods_name" name="goodsName"/>

            <field column="goods_sn" name="goodsSn"/>

            <field column="goods_update_time" name="goodsUpdateTime"/>

            <field column="goods_detail" name="goodsDetail"/>    

        </entity>

    </document>

</dataConfig>

 

4) managed-schema修改 ,添加自定义域

  <!--自定义的域-->

   <field name="goodsId" type="string" indexed="true" stored="true"/>

    <field name="goodsBrief" type="string" indexed="true" stored="true" />

    <field name="goodsName" type="text_ik" indexed="true" stored="true"  />

<field name="goodsSn" type="string" indexed="true" stored="true" />

    <field name="goods_detail" type="text_ik" indexed="true" stored="true"  />

    <field name="goodsUpdateTime" type="pdate" indexed="true" stored="true"  />

  <!--自定义的域 end-->

5)重启solr  solr restart -p 8983  执行导入(需要手动刷新状态)

 


6)查询



5实现实时重建索引和增量更新

 

参考:https://blog.csdn.net/xiatiandexiangrikui/article/details/80263544

 

二、springboot集成

 

1)添加依赖

<!-- 添加solr依赖 -->

<dependency>    

<groupId>org.springframework.data</groupId>    

<artifactId>spring-data-solr</artifactId>

</dependency>

 

2Application.yml配置

spring:  

 data:    

  solr:      

   host: http://127.0.0.1:8983/solr/meta_db

 

3)简单代码示例

@RestController

public class SolrController {

    @Autowired

    SolrClient solrClient;


    @RequestMapping("/solr/add")

    @ResponseBody

    public Object Test() throws Exception {


        List<SolrInputDocument> docs = new ArrayList<>();


        SolrInputDocument doc = new SolrInputDocument();


        /**

         * 添加字段索引,id一样,为修改,id不一样,为新增

         */

        doc.setField("id", "1");

        /**

         * 商品类目

         */

        doc.setField("md_name", "床上四件套1");

        /**

         * 商品名称

         */

        doc.setField("md_code", "cssjt1");


        docs.add(doc);


        doc = new SolrInputDocument();

        doc.setField("id", "2");

        doc.setField("md_name", "床上四件套2");

        doc.setField("md_code", "cssjt2");


        docs.add(doc);


        doc = new SolrInputDocument();

        doc.setField("id", "3");

        doc.setField("md_name", "床上四件套3");

        doc.setField("md_code", "cssjt3");


        docs.add(doc);


        doc = new SolrInputDocument();

        doc.setField("id", "3");

        doc.setField("md_name", "文具办公类");

        doc.setField("md_code", "钢笔");


        docs.add(doc);


        /**

         * 一次性全部添加

         */

        solrClient.add(docs);

        /**

         * 提交

         */

        solrClient.commit();


        return ResponseUtil.ok();

    }


    @RequestMapping("/solr/query")

    public Object Query() throws Exception {


        SolrQuery solrQuery = new SolrQuery();


        /**

         * *:*:表示查询全部 *Mac*代表左右模糊匹配,如果写Mac代表绝对匹配

         */

        solrQuery.set("q", "md_name:床上四件套*");


        /**

         * 过滤条件:电脑办公类,10000元以上 [A TO B] 范围A到B之间 [A TO *] A到无穷 [* TO B] B以下

         * 相当于sql语句中的where ----->fq = filter query

         */

     //   solrQuery.set("fq", "md_name:床上四件套");

      //  solrQuery.set("fq", "md_code:hello");


        // 分页,0开始,每页5条,setStart设置的就是显示第几页

        solrQuery.setStart(0);

        solrQuery.setRows(5);


        // 开启高亮

        solrQuery.setHighlight(true);

        // 添加高亮字段,多个字段之间逗号隔开比如: A,B,C

        solrQuery.addHighlightField("md_name,md_code");

        // 设置高亮字段的前缀

        solrQuery.setHighlightSimplePre("<font color='red'>");

        // 设置高亮字段的后缀

        solrQuery.setHighlightSimplePost("</font>");


        // 执行查询

        QueryResponse response = solrClient.query(solrQuery);


        // 文档结果集

        SolrDocumentList docs = response.getResults();


        System.err.println("-------------------高亮效果部分展示-------------------------");

        // 高亮显示的返回结果

        Map<String, Map<String, List<String>>> maplist = response.getHighlighting();

        /**

         * 静态html资源里面的对象 -- ${list}

         */

        List<Map<String, Object>> list = new ArrayList<Map<String, Object>>();

        Map<String, Object> m;

        // 返回高亮之后的结果..

        for (SolrDocument solrDocument : docs) {


            String id = solrDocument.getFirstValue("id").toString();

            String md_name = solrDocument.getFirstValue("md_name").toString();

            String md_code = solrDocument.getFirstValue("md_code").toString();


            m = new HashMap<String, Object>();

            m.put("id", id);

            m.put("md_name", md_name);

            m.put("md_code", md_code);


            list.add(m);

            System.err.println(md_name);

                    System.err.println(md_code);

            System.err.println("============分割线==============");


        }


        System.err.println("查询到的总条数:" + docs.getNumFound() + ", 内容:" + docs);



        return ResponseUtil.okList(list);


    }


    @RequestMapping("/solr/deleteall")

    @ResponseBody

    public Object DeleteAll() throws Exception {


        // 清空所有数据

        solrClient.deleteByQuery("*:*");

        solrClient.commit();


        return ResponseUtil.ok();

    }



 


以上是关于Solr使用的主要内容,如果未能解决你的问题,请参考以下文章

solr 使用

Solr7-4的学习与使用

solr使用教程面试+工作

solr7.4 安装与使用

Solr简介和使用(二期)

solr环境搭建&基本使用