1. 程式人生 > >Solr05-Solr在實際開發中的應用

Solr05-Solr在實際開發中的應用

示例 文件 主機 博客 版本 擴展 測試 責任 3.4

目錄

  • 1 配置中文分詞器
    • 1.1 準備IK中文分詞器
    • 1.2 配置schema.xml文件
      • 1.2.1 加入使用IK分詞器的域類型
      • 1.2.2 加入使用IK分詞器的域
    • 1.3 重啟Tomcat並測試
  • 2 配置業務域
    • 2.1 準備商品數據
    • 2.2 配置商品業務域
    • 2.3 配置schema.xml文件
    • 2.4 重新啟動Tomcat並查看配置
  • 3 配置數據導入處理器 -- DIH
    • 3.1 加入數據導入處理器的jar包
    • 3.2 加入數據庫驅動包
    • 3.3 配置solrconfig.xml文件
      • 3.3.1 配置lib標簽 --- 加入數據庫驅動&數據導入jar包
      • 3.3.2 配置requestHandler標簽 -- 加入數據導入處理器
      • 3.3.3 在conf目錄下創建data-config.xml
    • 3.4 重啟Tomcat並查看DIH的配置
    • 3.5 執行導入

1 配置中文分詞器

1.1 準備IK中文分詞器

  1. 復制IK解壓目錄中的jar包: IKAnalyzer2012FF_u1.jar. 可在 我的github 下載.

  2. 粘貼到tomcat/webapps/solr/WEB-INF/lib目錄.

  3. 復制IK解壓目錄中的配置文件:
    技術分享圖片

  4. 粘貼到tomcat/webapps/solr/WEB-INF/classes目錄.

1.2 配置schema.xml文件

1.2.1 加入使用IK分詞器的域類型

<!--加入使用ik分詞器的域類型-->
<fieldType name="text_ik" class="solr.TextField">
    <analyzer class="org.wltea.analyzer.lucene.IKAnalyzer" />
</fieldType>

1.2.2 加入使用IK分詞器的域

<!--加入使用ik分詞器的域-->
<field name="content_ik" type="text_ik" 
       indexed="false" stored="true" multiValued="true"/>

技術分享圖片

1.3 重啟Tomcat並測試

選擇任意Core, 然後在菜單欄裏選擇[Analysis], 輸入中文語句, 進行分詞測試:
技術分享圖片

2 配置業務域

需求引入: 假設現在要使用Solr完成電商網站商品數據的搜索, 需要將保存在關系數據庫中的商品數據導入到Solr索引庫中.

2.1 準備商品數據

DROP DATABASE IF EXISTS `solr`;
CREATE DATABASE `solr`;
USE `solr`;

SET FOREIGN_KEY_CHECKS=0;

DROP TABLE IF EXISTS `products`;
CREATE TABLE `products` (
    `pid` int(11) NOT NULL AUTO_INCREMENT COMMENT '商品編號',
    `name` varchar(255) DEFAULT NULL COMMENT '商品名稱',
    `catalog` int(11) DEFAULT NULL COMMENT '商品分類ID',
    `catalog_name` varchar(50) DEFAULT NULL COMMENT '商品分類名稱',
    `price` double DEFAULT NULL COMMENT '價格',
    `number` int(11) DEFAULT NULL COMMENT '數量',
    `description` longtext COMMENT '商品描述',
    `picture` varchar(255) DEFAULT NULL COMMENT '圖片名稱',
    `release_time` datetime DEFAULT NULL COMMENT '上架時間',
    PRIMARY KEY (`pid`)
) ENGINE=InnoDB AUTO_INCREMENT=6126 DEFAULT CHARSET=utf8;

具體表數據可在 我的github 下載.

2.2 配置商品業務域

說明: 分析商品數據庫表, 確定哪些字段需要在Solr中建立索引和存儲.

字段: pid, name, catalog, catalog_name, price, description, picture

  • 商品Id(直接使用Solr的id域):
<field name="id" type="string" indexed="true" stored="true" required="true" multiValued="true"/> 
  • 商品名稱(若要用於高亮顯示, 必須設置stored="true"):
<field name="product_name" type="text_ik" indexed="true" stored="true" /> 
  • 商品分類id:
<field name="product_catalog" type="int" indexed="true" stored="true" /> 
  • 商品分類名稱(String類型, 表示整體匹配, 不作分詞):
<field name="product_catalog_name" type="string" indexed="true" stored="true" /> 
  • 商品價格:
<field name="product_price" type="double" indexed="true" stored="true" /> 
  • 商品描述:
<field name="product_description" type="text_ik" indexed="true" stored="false" /> 
  • 商品圖片:
<field name="product_picture" type="string" indexed="false" stored="true" /> 
  • 配置商品復制域(stored="true", 實際開發中multiValued="true"的field不需要存儲, 這裏存儲便於觀察效果):
<!-- 加入商品搜索復制域, 即將商品名、商品類型和描述都作為搜索關鍵詞提供搜索 -->
<field name="product_keywords" type="text_ik" indexed="true" stored="true" multiValued="true"/> 
<copyField source="product_name" dest="product_keywords"/>
<copyField source="product_catalog_name" dest="product_keywords"/>
<copyField source="product_description" dest="product_keywords"/>

2.3 配置schema.xml文件

註意: 這裏id使用Solr默認的id域(一定要有主鍵, 沒有則需要將默認的id域刪除, 也可更改id生成策略. 嘗試過未在庫中設置主鍵而此文件中的id域未刪除也未重寫, 此時可以建立索引, 卻無法檢索到結果(⊙﹏⊙)):

技術分享圖片

2.4 重新啟動Tomcat並查看配置

選中任意一個core, 選擇Analysis, 在Fieldname / FieldType處查看, 觀察配置是否成功:
技術分享圖片

3 配置數據導入處理器 -- DIH

3.1 加入數據導入處理器的jar包

復制Solr解壓後dist目錄中的: solr-dataimporthandler-4.10.4.jar;

粘貼到contrib/dataimporthandler/lib(lib文件夾需要手動創建):

技術分享圖片

3.2 加入數據庫驅動包

復制所用數據庫服務器的相應jar包;

粘貼到contrib/db/lib(db/lib需要手動創建):
技術分享圖片

註意: 這裏使用的MySQL服務器版本為5.7.20, 故導入5.1.44版本的jar包 -- 其他較低版本的jar包可能會出現一些不可預知的Bug.

3.3 配置solrconfig.xml文件

在SolrCore(即collection1)中找到solrconfig.xml文件.

3.3.1 配置lib標簽 --- 加入數據庫驅動&數據導入jar包

<!-- 配置加入數據導入、數據庫驅動的jar包 -->
<lib dir="${solr.install.dir:../..}/contrib/dataimporthandler/lib" regex=".*\.jar"/>
<lib dir="${solr.install.dir:../..}/contrib/db/lib" regex=".*\.jar"/>

3.3.2 配置requestHandler標簽 -- 加入數據導入處理器

Solr的數據索引分兩種: 全量導入(full-import)和增量導入(delta-import), 顧名思義, 全量導入就是一次性全部導入所有數據, 而增量導入就是當數據庫中的數據有更新時再作導入處理.

使用dataimport就需要在solrconfig.xml中添加DIH配置信息:

<!-- 加入數據導入的請求處理器 -->
<requestHandler name="/dataimport" class="org.apache.solr.handler.dataimport.DataImportHandler">
    <lst name="defaults">
        <str name="config">data-config.xml</str>
    </lst>
</requestHandler>

3.3.3 在conf目錄下創建data-config.xml

註意: 這裏field的column屬性是對應數據庫中的字段, 而name屬性的值必須與scheme.xml中新配置的field的name屬性的值一致, 否則無法解析.

<?xml version="1.0" encoding="UTF-8" ?> 
<dataConfig>
    <!-- 數據源配置 -->
    <dataSource type="JdbcDataSource" 
            driver="com.mysql.jdbc.Driver" 
            url="jdbc:mysql://127.0.0.1:3306/solr?useSSL=true" 
            user="ur_login_name" 
            password="ur_pwd"/> 
    <document>
         <!-- 配置sql語句執行結果, 與商品業務域的對應關系 -->
         <entity name="product" pk="pid"
                 query="SELECT pid, name, catalog, catalog_name, price, description, picture 
                        FROM products">
             <field column="pid" name="id"/> 
             <field column="name" name="product_name"/> 
             <field column="catalog" name="product_catalog"/>
             <field column="catalog_name" name="product_catalog_name"/> 
             <field column="price" name="product_price"/> 
             <field column="description" name="product_description"/>
             <field column="picture" name="product_picture"/>
         </entity>
    </document> 
</dataConfig>

參數說明:

  • dataSource: 定義了數據的位置, 對於數據庫, 則是DSN(Data Source Name, 即數據源名稱, 數據庫服務器的主機名、端口和數據庫名、用戶、密碼); 對於HTTP數據源, 則是基本的URL.
  • entity: 實體會被處理生成包含多個字段的文檔的集合, 會被發送給Solr進行索引. 對於RDBMS數據源, 一個實體是一個視圖或表, 可能被一至多個SQL語句處理來生成一系列具有一或多個列(字段)的行(文檔).
  • processor: 一個實體處理器會完成整個從數據源抽取內容、轉換並將其添加到索引的工作, 可用自定義實體處理器擴展或替換默認提供的處理器.
  • transformer: 從實體中取得的每個字段的集都可以選擇進行轉換, 此過程可修改字段、創建新字段或從單個行生成多個行. 可通過公用接口自定義轉換器.
  • 其他配置用法說明:
<entity name="product" pk="pid"
        query="SELECT * FROM products"
        deltaImportQuery="SELECT * FROM products where pid='${dih.delta.id}'"
        deltaQuery="SELECT pid FROM products where last_modified > '${dih.last_index_time}'" >
    <field /> 
    <!-- ...... -->
</entity>
  • pk代表主鍵, query是在full-import模式下使用的查詢, deltaImportQuery和deltaQuery -- delta-import專用: 首先數據庫中要有一個類型為timestamp的類似於last_modified的時間字段, 當執行dataimport時, Solr會在conf目錄下自動生成dataimport.properties文件以記錄最後一次導入的時間, 當要執行delta-import時首先執行deltaQuery查出有改變的數據的id, 然後通過id來執行deltaImportQuery以增量導入數據.
  • 值得一提的是, Solr5之後使用${dih.delta.id}來獲取需要增量導入的數據的主鍵(之前使用的是${dataimporter.delta.ID}), 使用${dih.last_index_time}來獲取dataimport.properties文件中last_index_time的屬性值(之前使用的是${dataimporter.last_index_time}).

3.4 重啟Tomcat並查看DIH的配置

重啟Tomcat, 在菜單欄的[Dataimport]查看配置的Entity是否生效. 也可通過菜單欄的[Files]查看配置文件.
技術分享圖片

3.5 執行導入

  • 通過Solr管理界面的Dataimport方式導入:
    技術分享圖片

    註意: 由於Solr管理界面的不穩定性, 索引狀態的顯示可能會消失, 可通過查看Dashboard中JVM-Memory的波動程度, 確定是否處於索引狀態.

  • 也可通過HTTP請求的方式導入, HTTP請求URL格式為:

http://ip:port/[web-dir]/CoreName/dataimport?command=command[&params], 其中參數params有:

參數 描述
clean 默認為true, 表示是否在建立下一次索引前清除原有索引(慎用)
commit 默認為true, 表示是否在操作完成後提交
debug 默認為false, 表示是否以Debug模式運行. 此默認的commit默認為false.
entity 用已指定操作的entity, 只能指定DIH配置文件中內首層元素的name, 若傳遞空值, 則對所有entity執行操作.
optimize 默認為true, 表示在操作之後是否optimize(優化索引).
  • 示例:

    1) 如果執行全量導入, 導入前清除索引, 導入後提交結果, 則發送如下URL請求:

    http://ip:port/[webdir/]CoreName/dataimport?command=full-import&clean=true&commit=true

    2) 如果執行增量導入, 導入前不清除索引, 導入後提交結果, 則發送如下URL請求:

    http://ip:port/[webdir/]CoreName/dataimport?command=delta-import&clean=false&commit=true

版權聲明

作者: ma_shoufeng(馬瘦風)

出處: 博客園 馬瘦風的博客

您的支持是對博主的極大鼓勵, 感謝您的閱讀.

本文版權歸博主所有, 歡迎轉載, 但未經博主同意必須保留此段聲明, 且在文章頁面明顯位置給出原文鏈接, 否則博主保留追究法律責任的權利.

Solr05-Solr在實際開發中的應用