Solr使用

一、安装(win)

1、下载安装包

官网地址:https://www.apache.org/dyn/closer.lua/lucene/solr/

点击任意下载地址:

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

 

管理页面地址:http://localhost:8983/solr/

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

 

3、配置中文分词器 IK-Analyzer-Solr8
1)先下载solr8版本的ik分词器jar,下载地址:https://search.maven.org/search?q=com.github.magese
分词器GitHub源码地址:https://github.com/magese/ik-analyzer-solr

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

2)将resources目录下的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\conf
2) 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>

2、Application.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();
    }

欢迎关注微信公众号,留言建议。

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章