在Linux環境下,將Solr部署到tomcat7中,匯入Mysql資料庫資料, 定時更新索引,solrtomcat7
什麼是solr
solr是基於Lucene的全文檢索搜尋伺服器,對Lucene進行了擴充最佳化。
準備工作
首先,去下載以下軟體包:
JDK8:jdk-8u60-linux-x64.tar.gz
TOMCAT8:apache-tomcat-8.5.4.zip
SOLR5.5.3:solr-5.5.3.zip
並上傳到到linux伺服器某個路徑下,如,我放置在/usr/local/solr目錄下:
安裝solr:解壓solr-5.5.3.zip即可;
安裝tomcat、jdk:略,網上資料很多,基本上解壓,設定個環境變數就可以;
然後,安裝mysql:略,我安裝的是Mysql 5.5;
建立資料庫及表結構:我建立了一個資料庫solrdemo,以及user表,如,
updatetime:最後更新時間;
valid:是否有效,0表示已刪除的資料,不需要建立索引。
建立一個solr core
至於什麼叫做core,我覺得就是一個管理資料的東西,裡面有一些設定檔,索引的東西。具體建立步驟如下:
進入solr的bin目錄,輸入以下命令,啟動solr:
./solr start
可看到如下日誌:
[root@localhost bin]# ./solr start
Waiting up to 30 seconds to see Solr running on port 8983 [-]
Started Solr server on port 8983 (pid=9951). Happy searching!
然後輸入./solr create -c demo命令,建立一個core叫demo;
./solr create -c demo
可看到如下日誌:
Copying configuration to new core instance directory:
/usr/local/solr/solr-5.5.3/server/solr/demo
Creating new core 'demo' using command:
http://localhost:8983/solr/admin/cores?action=CREATE&name=demo&instanceDir=demo
{
"responseHeader":{
"status":0,
"QTime":7258},
"core":"demo"}
建立完畢;
關閉solr服務:
輸入命令./solr stop -all
./solr stop -all
可看到如下日誌:
Sending stop command to Solr running on port 8983 ... waiting 5 seconds to allow Jetty process 9951 to stop gracefully.
在/usr/local/solr/solr-5.5.3/server/solr目錄下可以看到我們建立的demo core
部署到tomcat
在tomcat的webapp目錄下建立一個檔案夾,叫solr;
拷貝/usr/local/solr/solr-5.5.3/server/solr-webapp/webapp目錄下的內容到/usr/local/solr/apache-tomcat-8.5.4/webapps/solr目錄下;
然後在/usr/local/solr/apache-tomcat-8.5.4/webapps/solr目錄下建立一個solrhome檔案夾,拷貝/usr/local/solr/solr-5.5.3/server/solr(裡面有一個我們剛剛建立好的core,“demo”)目錄下的內容到/usr/local/solr/apache-tomcat-8.5.4/webapps/solr/solrhome目錄下。
拷貝/usr/local/solr/solr-5.5.3/server/lib/ext目錄下的jar包到/usr/local/solr/apache-tomcat-8.5.4/webapps/solr/WEB-INF/lib下;
拷貝/usr/local/solr/solr-5.5.3/dist目錄下的solr-dataimporthandler-5.5.3.jar和solr-dataimporthandler-extras-5.5.3.jar到/usr/local/solr/apache-tomcat-8.5.4/webapps/solr/WEB-INF/lib下;
拷貝/usr/local/solr/solr-5.5.3/server/resources目錄下的log4j.properties檔案到/usr/local/solr/apache-tomcat-8.5.4/webapps/solr/WEB-INF/classes目錄,沒有classes檔案夾的自己建立一個。
修改/usr/local/solr/apache-tomcat-8.5.4/webapps/solr/WEB-INF/web.xml檔案內容,添加solr/home的配置資訊:
<env-entry> <env-entry-name>solr/home</env-entry-name> <env-entry-value>/usr/local/solr/apache-tomcat-8.5.4/webapps/solr/solrhome</env-entry-value> <env-entry-type>java.lang.String</env-entry-type> </env-entry>
修改/usr/local/solr/apache-tomcat-8.5.4/webapps/solr/solrhome/demo/conf/solrconfig.xml檔案,將75-85行修改為如下內容,因為我們是拷貝過來的,路徑變了,我這裡直接用絕對路徑。
<lib dir="/usr/local/solr/solr-5.5.3/contrib/extraction/lib" regex=".*\.jar" /> <lib dir="/usr/local/solr/solr-5.5.3/dist/" regex="solr-cell-\d.*\.jar" /> <lib dir="/usr/local/solr/solr-5.5.3/contrib/clustering/lib/" regex=".*\.jar" /> <lib dir="/usr/local/solr/solr-5.5.3/dist/" regex="solr-clustering-\d.*\.jar" /> <lib dir="/usr/local/solr/solr-5.5.3/contrib/langid/lib/" regex=".*\.jar" /> <lib dir="/usr/local/solr/solr-5.5.3/dist/" regex="solr-langid-\d.*\.jar" /> <lib dir="/usr/local/solr/solr-5.5.3/contrib/velocity/lib" regex=".*\.jar" /> <lib dir="/usr/local/solr/solr-5.5.3/dist/" regex="solr-velocity-\d.*\.jar" />
最後,啟動tomcat,記得開放8080連接埠,可以修改/etc/sysconfig/iptables,添加-A RH-Firewall-1-INPUT -m state --state NEW -m tcp -p tcp --dport 8080 -j ACCEPT,然後輸入service iptables restart重啟iptables服務。
接著,瀏覽器輸入http://192.168.229.100:8080/solr/index.html,可以看到我們建立的core demo,如:
匯入mysql資料庫資料,並建立索引
1、下載mysql串連驅動,如mysql-connector-java-5.1.22-bin.jar,拷貝到/usr/local/solr/apache-tomcat-8.5.4/webapps/solr/WEB-INF/lib目錄;
2、在/usr/local/solr/apache-tomcat-8.5.4/webapps/solr/solrhome/demo/conf目錄下建立一個檔案data_config.xml,內容如下:
<dataConfig><dataSource name="solrdemo" type="JdbcDataSource" driver="com.mysql.jdbc.Driver" url="jdbc:mysql://192.168.229.1:3306/solrdemo" user="root" password="root"/> <document> <entity dataSource="solrdemo" name="user" query="select id, name, address from user where valid=1 " deltaImportQuery="select id,name,address from user where ID='${dataimporter.delta.id}'" deltaQuery="select id from user where updatetime > '${dataimporter.last_index_time}'" deletedPkQuery="select id from user where valid=0"> <field column="id" name="id"/> <field column="name" name="name"/> <field column="address" name="address"/> </entity> </document></dataConfig>
修改/usr/local/solr/apache-tomcat-8.5.4/webapps/solr/solrhome/demo/conf目錄下的managed-schema檔案,添加如下兩行,id已經有了,不用添加:
<field name="address" type="string" indexed="true" stored="true" required="true"/> <field name="name" type="string" indexed="true" stored="true" required="true" />
修改/usr/local/solr/apache-tomcat-8.5.4/webapps/solr/solrhome/demo/conf目錄下的managed-schema檔案,添加如下內容:
<requestHandler name="/dataimport" class="org.apache.solr.handler.dataimport.DataImportHandler"> <lst name="defaults"> <str name="config">data-config.xml</str> </lst> </requestHandler>
然後,重新啟動tomcat,並訪問http://192.168.229.100:8080/solr/index.html,選擇demo core,開啟dataimport標籤頁,點擊execute,更新索引,如:
開啟query標籤頁,可以看到我們資料庫中的資料,這裡我們的參數q為*.*,匹配所有,如下:
定時更新索引
下載apache-solr-dataimportscheduler.jar庫,並將其拷貝到/usr/local/solr/apache-tomcat-8.5.4/webapps/solr/WEB-INF/lib目錄。
修改/usr/local/solr/apache-tomcat-8.5.4/webapps/solr/WEB-INF/web.xml檔案,添加監聽器:
<listener>
<listener-class>
org.apache.solr.handler.dataimport.scheduler.ApplicationListener
</listener-class>
</listener>
在/usr/local/solr/apache-tomcat-8.5.4/webapps/solr/solrhome/目錄建立一個conf檔案夾,並在該檔案夾下建立dataimport.properties檔案,檔案內容如下:
################################################## ## dataimport scheduler properties ## ################################################### to sync or not to sync# 1 - active; anything else - inactivesyncEnabled=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 deploymentsyncCores=demo# solr server name or IP address# [defaults to localhost if empty]server=192.168.229.100# solr server port# [defaults to 80 if empty]port=8080# application name/context# [defaults to current ServletContextListener's context (app) name]webapp=solr# URL params [mandatory]# remainder of URLparams=/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=/dataimport?command=full-import&clean=true&commit=true# 重做索引時間間隔的計時開始時間,第一次真正執行的時間=reBuildIndexBeginTime+reBuildIndexInterval*60*1000;# 兩種格式:2012-04-11 03:10:00 或者 03:10:00,後一種會自動補全日期部分為服務啟動時的日期reBuildIndexBeginTime=03:00:00
這裡,我們配置兩分鐘更新索引。
重啟tomcat,觀察日誌,發現每隔兩分鐘會自動更新索引;
也可以自己做個小測試,往資料庫插入資料,然後搜尋,發現找不到,但是等過了兩分鐘再次搜尋,發現可以找到。
資源檔
https://github.com/peterchenhdu/Demos/tree/master/solr-in-tomcat
參考:https://cwiki.apache.org/confluence/display/solr/Apache+Solr+Reference+Guide