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();
    }

歡迎關注微信公衆號,留言建議。

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