solr 開發指南
1.1.1 官網介紹
Solr是一個基於Lucene的Java搜索引擎服務器。Solr 提供了層面搜索、命中醒目顯示並且支持多種輸出格式(包括 XML/XSLT 和 JSON 格式)。它易於安裝和配置,而且附帶了一個基於 HTTP 的管理界面。Solr已經在衆多大型的網站中使用,較爲成熟和穩定。Solr 包裝並擴展了 Lucene,所以Solr的基本上沿用了Lucene的相關術語。更重要的是,Solr 創建的索引與
Lucene 搜索引擎庫完全兼容。通過對 Solr 進行適當的配置,某些情況下可能需要進行編碼,
Solr 可以閱讀和使用構建到其他 Lucene 應用程序中的索引。此外,很多 Lucene 工具(如 Nutch、 Luke)也可以使用Solr 創建的索引。 總結一下:solr是一個java搜索引擎服務器(是一套war程序),內部集成了Lucene(apache提供的一些對搜索引擎做支持的jar包)。
1.2.2 solr 功能
Ø 保存數據
Ø 建立索引,維護索引
Ø 數據檢索(全文搜索,高亮顯示,精確搜索等)
1.2.3 solr 依賴環境
Ø Jdk 1.7+
Ø TOMCAT7+
Ø 課程選用版本:solr4.9.1
1.2 solr 服務器搭建
1.2.1 初始配置 solr 截止到文檔編寫前,solr目前的最新版本爲6.5.1,在本次項目開發中,我們選用solr比較成
熟穩定的版本solr 4.9.1。
1. 官網下載solr4.9.1的程序安裝包。
下載地址:http://archive.apache.org/dist/lucene/solr/
2. 解壓solr的zip包,目錄如下
3. 將dist\solr-4.9.1.war文件複製到tomcat的webapps目錄下,並將文件命名爲solr.war
4. 複製solr解壓包下example\lib\ext 下所有的jar 到tomcat 的lib目錄下
5. 在計算機本地新建一個文件夾solr_home(當然你可以隨便起名字), 然後複製
solr-4.9.1\example\solr 下的所有文件到 solr_home下
6. 啓動tomcat,待tomcat啓動成功後,關閉tomcat。打開tomcat的webapps目錄。注意,此時solr的war包以及被解壓成solr文件夾。刪除tomcat 的webapps目錄下的solr的war
包,保留solr文件夾。
7. 修改配置文件apache-tomcat-7.0.67\webapps\solr\WEB-INF\web.xml
<env-entry> <env-entry-name>solr/home</env-entry-name> <env-entry-value> F:/solr_home</env-entry-value> <env-entry-type>java.lang.String</env-entry-type> </env-entry> |
8. 訪問solr(http://localhost:端口號/solr/),如出現以下界面則solr部署成功。
1.2.2 新建數據配置 core
1. 新建core(solr中把配置的每一個模塊都叫core),在solr_home目錄下,拷貝collection1文件夾,並起名爲test。打開test文件夾,修改core.properties文件,將name修改爲test
2. 重新啓動tomcat,並訪問solr,如出現以下界面,則表示新建testcore成功。
3. 重新啓動tomcat,並訪問solr,如出現以下界面,則表示新建testcore成功。
1.2.3 新增數據庫配置
到目前爲止,我們已經完成了solr的基礎配置,並且創建了test core,接下來我們需要把數據的數據和搜索引擎連接起來,讓搜索引擎可以讀取數據庫的數據。
1. 拷貝數據庫連接jar包(mysql-connector-java-5.1.18.jar)到tomcat的lib目錄
2. 以創建test core的方式新建hotel core
3. 打開hotel的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>
4. 在hotel的的conf文件夾下並新建data-config.xml文件,配置如下
<?xml version="1.0" encoding="UTF-8"?> <dataConfig> <dataSource type="JdbcDataSource" driver="com.mysql.jdbc.Driver" url="jdbc:mysql://127.0.0.1:3306/itripdb" user="root" password="root" /> <document name="hotel_doc"> <entity name="hotel" pk="id" query=" select id,hotelName,address from itrip_hotel"> <field column="id" name="id"/> <field column="hotelName" name="hotelName"/> <field column="address" name="address"/> </entity> </document> </dataConfig> |
Ø dataSource是數據庫數據源。
Ø Entity就是一張表對應的實體,pk是主鍵,query是查詢語句。
Ø Field對應一個字段,column是數據庫裏的column名,後面的name屬性對應着Solr的Filed 的名字。
5. 打開hotel的conf目錄下的schema.xml文件
(1)保留_version_ 這個field
(2)添加索引字段:這裏每個field的name要和data-config.xml裏的entity的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/itripdb" user="root" password="root" /> <document name="hotel_doc"> <entity name="hotel" pk="id" query=" select id,hotelName,address from itrip_hotel"> <field column="id" name="id"/> <field column="hotelName" name=" hotelName"/> <field column="address" name=" address"/> </entity> </document> </dataConfig> |
修改同目錄下的schema.xml(schema.xml 是solr對數據庫裏的數據進行索引管理和數據字段展示管理的配置文件)
Ø 刪除多餘的field,保留_version_ 和test這兩個field(注意不要刪除fieldType)
Ø 添加索引字段:這裏每個field的name要和data-config.xml裏的entity的field的name一樣,
一一對應。紅色加粗部分爲新增內容。
<fieldname="_version_" type="long" indexed="true"stored="true"/>
<field name="id"type="string" indexed="true" stored="true"/>
<fieldname="hotelName" type="string" indexed="true"stored="true"/>
<fieldname="address" type="string" indexed="true"stored="true"/>
<uniqueKey>id</uniqueKey>
<field name="text" type="text_general"indexed="true" stored="false"multiValued="true"/>
6. 將導入數據的JAR包拷貝到webapps/solr的lib目錄下
7. 啓動Tomcat,執行數據導入。
8. 查詢數據
到目前爲止,我們已經將數據庫的數據導入到solr當中了,並且已經查詢成功。
1.2.4 配置增量更新
以上的步驟我們實現瞭如何將數據庫的數據導入到solr中,接下來需要配置solr的增量更新,即定時將數據庫的數據導入到solr中。
1. 將資料中提供的apache-solr-dataimports-cheduler.jar包添加至solr的lib目錄下 注:apachesolrdataimportscheduler.jar的jar包是apache提供的用於增量更新的jar包,但
apache提供的原jar包中,代碼有BUG。該bug在教學資料提供的jar包中已經被修復,具體可參
考提供的apachesolrdataimportscheduler的源碼,在此不再贅述。
2. 將資料中提供的apache-solr-dataimports-cheduler.jar包添加至solr的lib目錄下。
3. 增加增量更新配置文件,在solr_home文件夾下新建conf文件夾,並新建名爲 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=test,hotel # solr server name or IP address # [defaults to localhost if empty] server=localhost # 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 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,即5天; # 爲空,爲0,或者註釋掉:表示永不重做索引 #reBuildIndexInterval=7200 # 重做索引的參數 reBuildIndexParams=/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 |
4. 新增增量更新數據的監聽器,在solr的web.xml中加入以下監聽器
<listener> <listener-class> org.apache.solr.handler.dataimport.scheduler.ApplicationListener </listener-class> </listener> |
5. 修改導入數據查詢SQL
<?xml version="1.0"encoding="UTF-8"?>
<dataConfig>
<dataSource type="JdbcDataSource"driver="com.mysql.jdbc.Driver" url="jdbc:mysql://127.0.0.1:3306/itripdb"user="root" password="root" />
<document name="hotel_doc">
<entity name="hotel" pk="id" query="select id,hotelName,address fromitrip_hotel" deltaImportQuery="selectid,hotelName,address from itrip_hotel where id
='${dih.delta.id}'"
deltaQuery="SELECT id as id FROM itrip_hotel where modifyDate >
'${dih.last_index_time}'">
<field column="id"name="id"/>
<field column="hotelName"name="hotelName"/>
<field column="address"name="address"/>
</entity>
</document>
</dataConfig>
說明:deltaQuery是根據dataimport.properties配置文件中的更新時間,從數據庫中查詢出,修
改日期在最後一次更新日期之後的酒店數據,並記錄其id,而deltaImportQuery的目的是將 deltaQuery查詢出的數據導入到solr中。 6. 啓動Tomcat進行測試
Ø 啓動Tomcat,訪問hotel模塊
Ø 修改數據庫中的酒店數據並同時修改該數據的modifyDate時間,
Ø 1分鐘後查詢酒店數據,確定數據是否更新
1.2.5 配置分詞器
Ø 分詞器: 是從用戶輸入的一段文本中提取關鍵詞,用於其它業務操作。
Ø 常見的 JAVA分詞器: word 分詞器、Ansj 分詞器、Stanford 分詞器、IKAnalyzer 分詞器
Ø 課程選用分詞器:IKAnalyzer分詞器
Ø solr如果是 3.x 版本的用 IKAnalyzer2012_u6.zip 如果是 4.x 版本的用 IK Analyzer
2012FF_hf1.zip,一定要對應上,要不然會配置失敗。
Ø IK 分詞器下載地址:http://download.csdn.net/download/tjcyjd/8420639
1. 首先,下載IKAnalyzer 。
2. 將ik的所有jar文件 拷貝到 webapps\solr\WEB-INF\lib 目錄下
3. 在webapps\solr\WEB-INF\下新建classes文件夾,將IKAnalyzer.cfg.xml和stopword.dic
文件拷貝到改文件夾下。
4. 在 solr_home\hotel\conf\schema.xml 增加如下配置
<fieldType name="text_ik" class="solr.TextField"> |
|
<analyzer type="index" class="org.wltea.analyzer.lucene.IKAnalyzer"/> | isMaxWordLength="false" |
<analyzer type="query" class="org.wltea.analyzer.lucene.IKAnalyzer"/> </fieldType> | isMaxWordLength="true" |
5. 修改solr_home\hotel\conf\schema.xml將hotelName和address指定成爲text_ik類型
<field name="hotelName" type="text_ik"indexed="true" stored="true"/>
<field name="address" type="text_ik"indexed="true" stored="true"/>
6. 重啓Tomcat,訪問solr測試分詞器
7. 如果分詞器出現上邊的顯示結果,則表示分詞器配置成功。
1.3常見異常
1.3.1 刪除了默認字段(text 或者_version_)
1.3.2 沒有加入增量更新的 jar 包
1.3.3 沒有加入增量更新的配置文件
1.4調試技巧
在 solr 配置的過程中,難免會碰到各種各樣的問題。如,在配置過程中,出現問題,可
以通過以下日誌對配置進行排查。
1.4.1solr 日誌
1.4.2 tomcat 日誌
1.5 solr 應用
1.5.1 舉例 愛旅行項目搜索分析
以上我們已經成功的搭建了solr的服務,那麼solr服務如何集成到我們項目當中,首先我們
來分析愛旅行項目中的酒店搜索的需求:
Ø 搜索條件包括目的地、入住時間、退房時間、關鍵詞、位置、價格、酒店級別、酒店特
色。
Ø 關鍵詞和目的地需要對多個字段進行檢索,比如酒店名稱、酒店地址、酒店描述等。
Ø 酒店搜索關聯多個數據庫表,這其中包括酒店表、區域表、酒店區域關聯表、房間表、特色表、酒店特色關聯表、酒店評論表、圖片表。
Ø 搜索過程中包括一些複雜搜索,包括平均分計算、評論人數統計、點評人數統計、庫存
計算等。
Ø 搜索過程中,需要對關鍵詞。 如果我們使用傳統的技術來實現以上的酒店搜索的功能會有以下問題:
Ø 傳統的like關鍵詞匹配大字段效率低下。
Ø 每次查詢都執行復雜SQL,數據庫壓力很大。
1.5.2 solr 基本查詢語法
Ø q – 查詢字符串。
Ø fl – 指定返回那些字段內容,用逗號或空格分隔多個。
Ø start – 返回第一條記錄在完整找到結果中的偏移位置,0 開始,一般分頁用。
Ø rows – 指定返回結果最多有多少條記錄,配合 start 來實現分頁。
Ø sort – 排序,格式:sort=<field name>+<desc|asc>[,<fieldname>+<desc|asc>]„ 。示例:
(inStock desc, price asc)表示先 “inStock” 降序, 再 “price” 升序,默認是相關性
降序。
Ø wt – (writer type)指定輸出格式,可以有 xml, json, php, phps, 後面 solr 1.3 增加的,
要用通知我們,因爲默認沒有打開。
Ø fq – (filterquery)過慮查詢,作用:在 q 查詢符合結果中同時是 fq查詢符合的,例如:q=mm&fq=date_time:[20081001 TO 20091031],找關鍵字 mm,並且 date_time 是
1.5.3 solr 多字段匹配針對關鍵詞多字段的搜索,solr中提供了相應的檢索機制。
1. 在hotel/conf/schema.xml文件中新增filed字段存儲多字段的值(紅色內容爲新增部分)
<field name="_version_" type="long"indexed="true" stored="true"/>
<field name="id" type="long"indexed="true" stored="true"/>
<field name="hotelName" type="text_ik"indexed="true" stored="true"/>
<field name="address" type="text_ik"indexed="true" stored="true"/>
<field name="keyword" type="text_ik"indexed="true" stored="true"multiValued="true"/>
<copyField source="hotelName"dest="keyword"/>
<copyField source="address" dest="keyword"/>
2. 重新執行數據導入,並查詢,出現以下結果則多字段配置正確。
3. 關鍵詞搜索,查看查詢結果是否正確
1.5.4 solrj 集成 solr 應用以上的操作中,我們根據業務,完善了solr服務器,接下來我們將學習,如何把solr項目集成到項目中來。solr本身提供了對外調用的Http接口,利用Http請求可以直接從solr中獲取數據。 爲了方便Java程序員調用solr,Apache提供了基於solr操作的solrj程序包。
1.下載solrj程序包
Ø 系統中選用的solrj版本:5.3.1
Ø solrj下載:maven方式
<dependency> <groupId>org.apache.solr</groupId> <artifactId>solr-solrj</artifactId> <version>5.3.1</version> </dependency> |
2. 在程序中創建solr查詢的接收對象(省略get、set)
3. 創建main程序調用solr應用
1.6上傳服務器
在本地配置好solr和solr_home後,可以將裝載有solr的tomcat和solr_home文件夾直接拷貝
到Linux服務器。此處注意要修改solr中的web.xml的solr_home的地址修改爲solr_home在服務
器的實際目錄。