參看文獻: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