使用Solr索引MySQL數據


參看文獻:https://www.cnblogs.com/luxiaoxun/p/4442770.html

版本:solr-5.3.0

1、創建core或collection:bin/solr create -c collection3

solr-5.0 以上默認對schema的管理是使用managed-schema,不能手動修改,需要使用Schema Restful的API操作。如果要想手動修改配置,把managed-schema拷貝一份修改為schema.xml,在solrconfig.xml中修改如下:

<!-- <schemaFactory class="ManagedIndexSchemaFactory">
    <bool name="mutable">true</bool>
    <str name="managedSchemaResourceName">managed-schema</str>
  </schemaFactory> -->
  
<!-- <processor class="solr.AddSchemaFieldsUpdateProcessorFactory">
      <str name="defaultFieldType">strings</str>
      <lst name="typeMapping">
        <str name="valueClass">java.lang.Boolean</str>
        <str name="fieldType">booleans</str>
      </lst>
      <lst name="typeMapping">
        <str name="valueClass">java.util.Date</str>
        <str name="fieldType">tdates</str>
      </lst>
      <lst name="typeMapping">
        <str name="valueClass">java.lang.Long</str>
        <str name="valueClass">java.lang.Integer</str>
        <str name="fieldType">tlongs</str>
      </lst>
      <lst name="typeMapping">
        <str name="valueClass">java.lang.Number</str>
        <str name="fieldType">tdoubles</str>
      </lst>
    </processor> -->
    
  <schemaFactory class="ClassicIndexSchemaFactory"/>

創建MySQL數據

 

使用DataImportHandler導入並索引數據

G:\solr-5.3.0\server\solr\collection3\conf\solrconfig.xml

<requestHandler name="/select" class="solr.SearchHandler">前面上加上一個dataimport的處理的Handler

 

<requestHandler name="/dataimport" class="org.apache.solr.handler.dataimport.DataImportHandler">
       <lst name="defaults">
          <str name="config">data-config.xml</str>
       </lst>
  </requestHandler>

2) 在同目錄下添加data-config.xml

<?xml version="1.0" encoding="UTF8" ?>
<dataConfig>
    <dataSource driver="com.mysql.jdbc.Driver" url="jdbc:mysql://127.0.0.1:3306/test" user="root" password="888" batchSize="-1" />
   <document name="testDoc">
        <entity name="user" pk="id" query="select * from user"
             deltaImportQuery="select * from user where id='${dih.delta.id}'"
                deltaQuery="select id from user where updateTime> '${dataimporter.last_index_time}'">
         <field column="id" name="id"/>
         <field column="userName" name="userName"/>
            <field column="userAge" name="userAge"/>
            <field column="userAddress" name="userAddress"/>
            <field column="updateTime" name="updateTime"/>
     </entity>
  </document>
</dataConfig>

說明:

dataSource是數據庫數據源。

Entity就是一張表對應的實體,pk是主鍵,query是查詢語句。

Field對應一個字段,column是數據庫里的column名,后面的name屬性對應着Solr的Filed的名字。

3) 修改同目錄下的schema.xml,這是Solr對數據庫里的數據進行索引的模式

1)保留_version_ 這個field

2)添加索引字段:這里每個field的name要和data-config.xml里的entity的field的name一樣,一一對應。

 

 

3)刪除多余的field,刪除copyField里的設置,這些用不上。注意:text這個field不能刪除,否則Solr啟動失敗。

(4)設置唯一主鍵:<uniqueKey>id</uniqueKey>,注意:Solr中索引的主鍵默認是只支持type="string"字符串類型的,而我的數據庫中id是int型的,會有問題,解決方法:修改同目錄下的elevate.xml,注釋掉下面2行,這貌似是Solr的Bug,原因不明。

 

拷貝mysql-connector-java-5.1.36.jar和solr-dataimporthandler-5.3.0.jar,solr-dataimporthandler-extras-5.3.0.jar到G:\solr-5.3.0\server\solr-webapp\webapp\WEB-INF\lib一個是mysql的java驅動,另一個在G:\solr-5.3.0\dist目錄里

重啟Solr。

如果配置正確就可以啟動成功。

solrconfig.xml是solr的基礎文件,里面配置了各種web請求處理器、請求響應處理器、日志、緩存等。

schema.xml配置映射了各種數據類型的索引方案。分詞器的配置、索引文檔中包含的字段也在此配置。

進入Solr主頁,在Core Selector中選擇collection1:http://localhost:8983/solr/#/collection3

點擊Dataimport,Command選擇full-import(默認),點擊“Execute”,Refresh Status就可以看到結果:

查詢:

 

所搜的時候,如果要實現整詞搜索則加雙引號,比如 "小米手機"

DIH增量從MYSQL數據庫導入數據

已經學會了如何全量導入MySQL的數據,全量導入在數據量大的時候代價非常大,一般來說都會適用增量的方式來導入數據,下面介紹如何增量導入MYSQL數據庫中的數據,以及如何設置定時來做。

1)數據庫表的更改

前面已經創建好了一個User的表,這里為了能夠進行增量導入,需要新增一個字段updateTime,類型為timestamp,默認值為CURRENT_TIMESTAMP。

有了這樣一個字段,Solr才能判斷增量導入的時候,哪些數據是新的。

因為Solr本身有一個默認值last_index_time,記錄最后一次做full import或者是delta import(增量導入)的時間,這個值存儲在文件conf目錄的dataimport.properties文件中。

2)data-config.xml中必要屬性的設置

transformer 格式轉化:HTMLStripTransformer 索引中忽略HTML標簽

query:查詢數據庫表符合記錄數據

deltaQuery:增量索引查詢主鍵ID  注意這個只能返回ID字段   

deltaImportQuery:增量索引查詢導入的數據 

deletedPkQuery:增量索引刪除主鍵ID查詢 注意這個只能返回ID字段   

有關“query”,“deltaImportQuery”, “deltaQuery”的解釋,引用官網說明,如下所示:
The query gives the data needed to populate fields of the Solr document in full-import
The deltaImportQuery gives the data needed to populate fields when running a delta-import
The deltaQuery gives the primary keys of the current entity which have changes since the last index time

如果需要關聯子表查詢,可能需要用到parentDeltaQuery

增量索引的原理是從數據庫中根據deltaQuery指定的SQL語句查詢出所有需要增量導入的數據的ID號。

然后根據deltaImportQuery指定的SQL語句返回所有這些ID的數據,即為這次增量導入所要處理的數據。

核心思想是:通過內置變量“${dih.delta.id}”和 “${dataimporter.last_index_time}”來記錄本次要索引的id和最近一次索引的時間。

如果業務中還有刪除操作,可以在數據庫中加一個isDeleted字段來表明該條數據是否已經被刪除,這時候Solr在更新index的時候,可以根據這個字段來更新哪些已經刪除了的記錄的索引。

這時候需要在dataConfig.xml中添加:

query="select * from user where isDeleted=0"
deltaImportQuery="select * from user where id='${dih.delta.id}'"
deltaQuery="select id from user where updateTime> '${dataimporter.last_index_time}' and isDeleted=0"
deletedPkQuery="select id from user where isDeleted=1"

測試增量導入

如果User表里有數據,可以先清空以前的測試數據(因為加的updateTime沒有值),用我的Mybatis測試程序添加一個User,數據庫會以當前時間賦值給該字段。在Solr中使用Query查詢所有沒有查詢到該值,使用dataimport?command=delta-import增量導入,再次查詢所有就可以查詢到剛剛插入到MySQL的值。

 

設置增量導入為定時執行的任務

可以用Windows計划任務,或者Linux的Cron來定期訪問增量導入的連接來完成定時增量導入的功能,這其實也是可以的,而且應該沒什么問題。

但是更方便,更加與Solr本身集成度高的是利用其自身的定時增量導入功能。

下載apache-solr-dataimportscheduler-1.0.jar放到\solr-webapp\webapp\WEB-INF\lib目錄下:

2、修改solr的WEB-INF目錄下面的web.xml文件:
為<web-app>元素添加一個子元素

<listener>
        <listener-class>
    org.apache.solr.handler.dataimport.scheduler.ApplicationListener
        </listener-class>
    </listener>

3、新建配置文件dataimport.properties:

在G:\solr-5.3.0\server\solr目錄下面新建一個目錄conf(注意不是G:\solr-5.3.0\server\solr\collection3下面的conf),然后用解壓文件打開apache-solr-dataimportscheduler-1.0.jar文件,將里面的dataimport.properties文件拷貝過來,進行修改,下面是最終我的自動定時更新配置文件內容:

#################################################
#                                               #
#       dataimport scheduler properties         #
#                                               #
#################################################

#  to sync or not to sync
#  1 - active; anything else - inactive
syncEnabled=1

#  which cores to schedule
#  in a multi-core environment you can decide which cores you want syncronized
#  leave empty or comment it out if using single-core deployment
syncCores=collection3

#  solr server name or IP address
#  [defaults to localhost if empty]
server=localhost

#  solr server port
#  [defaults to 80 if empty]
port=8983

#  application name/context
#  [defaults to current ServletContextListener's context (app) name]
webapp=solr

#  URL params [mandatory]
#  remainder of URL
params=/dataimport?command=delta-import&clean=false&commit=true

#  schedule interval
#  number of minutes between two runs
#  [defaults to 30 if empty]
interval=1

#  重做索引的時間間隔,單位分鍾,默認7200,即1天; 
#  為空,為0,或者注釋掉:表示永不重做索引
reBuildIndexInterval=2

#  重做索引的參數
reBuildIndexParams=/select?qt=/dataimport&command=full-import&clean=true&commit=true

#  重做索引時間間隔的計時開始時間,第一次真正執行的時間=reBuildIndexBeginTime+reBuildIndexInterval*60*1000;
#  兩種格式:2012-04-11 03:10:00 或者  03:10:00,后一種會自動補全日期部分為服務啟動時的日期
reBuildIndexBeginTime=03:10:00

 

遇到的問題:

 

1字節的UTF-8序列的字節1無效

1.手動將<?xml version="1.0" encoding="UTF-8"?>中的UTF-8更改成UTF8

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM