Solr 安裝及配置
什麼是solr
Solr 是Apache下的一個頂級開源專案,採用Java開發,它是基於Lucene的全文搜尋伺服器。Solr提供了比Lucene更為豐富的查詢語言,同時實現了可配置、可擴充套件,並對索引、搜尋效能進行了優化。
Solr可以獨立執行,執行在Jetty、Tomcat等這些Servlet容器中,Solr索引的實現方法很簡單,用POST方法向Solr伺服器傳送一個描述Field及其內容的XML文件,Solr根據xml文件新增、刪除、更新索引 。Solr搜尋只需要傳送HTTP GET請求,然後對Solr返回Xml、json等格式的查詢結果進行解析,組織頁面佈局。Solr不提供構建UI
的功能,Solr提供了一個管理介面,通過管理介面可以查詢Solr的配置和執行情況。Solr與Lucene的區別:
Lucene是一個開放原始碼的全文檢索引擎工具包,它不是一個完整的全文檢索引擎,Lucene提供了完整的查詢引擎和索引引擎,目的是為軟體開發人員提供一個簡單易用的工具包,以方便的在目標系統中實現全文檢索的功能,或者以Lucene為基礎構建全文檢索引擎。
Solr的目標是打造一款企業級的搜尋引擎系統,它是一個搜尋引擎服務,可以獨立執行,通過Solr可以非常快速的構建企業的搜尋引擎,通過Solr也可以高效的完成站內搜尋功能。
Solr安裝及配置
Solr的下載:
從Solr官方網站(
http://lucene.apache.org/solr/ )下載Solr4.10.3,根據Solr的執行環境,Linux下需要下載lucene-4.10.3.tgz,windows下需要下載lucene-4.10.3.zip。Solr使用指南可參考:https://wiki.apache.org/solr/FrontPage。
Solr的資料夾結構
將solr-4.10.3.zip解壓:
bin:solr的執行指令碼
contrib:solr的一些貢獻軟體/外掛,用於增強solr的功能。
dist:該目錄包含build過程中產生的war和jar檔案,以及相關的依賴檔案。
docs:solr的API文件
example:
solr工程的例子目錄:l example/solr:
該目錄是一個包含了預設配置資訊的Solr的Core目錄。
l example/multicore:
該目錄包含了在Solr的multicore中設定的多個Core目錄。
l example/webapps:
該目錄中包括一個solr.war,該war可作為solr的執行例項工程。
licenses:solr相關的一些許可資訊
執行環境
solr 需要執行在一個Servlet容器中,Solr4.10.3要求jdk使用1.7以上,Solr預設提供Jetty(java寫的Servlet容器),本教程使用Tocmat作為Servlet容器,環境如下:
Solr:Solr4.10.3
Jdk:jdk1.7.0_72
Tomcat:apache-tomcat-7.0.53
Solr整合tomcat
Solr Home與SolrCore:
建立一個Solr home目錄,SolrHome是Solr執行的主目錄,目錄中包括了執行Solr例項所有的配置檔案和資料檔案,Solr例項就是SolrCore,一個SolrHome可以包括多個SolrCore(Solr例項),每個SolrCore提供單獨的搜尋和索引服務。
example\solr是一個solr home目錄結構,如下:
上圖中“collection1”是一個SolrCore(Solr例項)目錄 ,目錄內容如下所示:
說明:
collection1:叫做一個Solr執行例項SolrCore,SolrCore名稱不固定,一個solr執行例項對外單獨提供索引和搜尋介面。
solrHome中可以建立多個solr執行例項SolrCore。
一個solr的執行例項對應一個索引目錄。
conf是SolrCore的配置檔案目錄 。
data目錄存放索引檔案需要建立
整合步驟:
第一步:安裝tomcat。D:\temp\apache-tomcat-7.0.53
第二步:把solr的war包複製到tomcat的webapp目錄下。
把\solr-4.10.3\dist\solr-4.10.3.war複製到D:\temp\apache-tomcat-7.0.53\webapps下。
改名為solr.war
第三步:solr.war解壓。使用壓縮工具解壓或者啟動tomcat自動解壓。解壓之後刪除solr.war
第四步:把\solr-4.10.3\example\lib\ext目錄下的所有的jar包新增到solr工程中
第五步:配置solrHome和solrCore。
1)建立一個solrhome(存放solr所有配置檔案的一個資料夾)。\solr-4.10.3\example\solr目錄就是一個標準的solrhome。
2)把\solr-4.10.3\example\solr資料夾複製到D:\temp\0108路徑下,改名為solrhome,改名不是必須的,是為了便於理解。
3)在solrhome下有一個資料夾叫做collection1這就是一個solrcore。就是一個solr的例項。一個solrcore相當於mysql中一個數據庫。Solrcore之間是相互隔離。
i. 在solrcore中有一個資料夾叫做conf,包含了索引solr例項的配置資訊。
ii. 在conf資料夾下有一個solrconfig.xml。配置例項的相關資訊。如果使用預設配置可以不用做任何修改。
Xml的配置資訊:
Lib:solr服務依賴的擴充套件包,預設的路徑是collection1\lib資料夾,如果沒有 就建立一個
dataDir:配置了索引庫的存放路徑。預設路徑是collection1\data資料夾,如果沒有data資料夾,會自動建立。
requestHandler:
第六步:告訴solr伺服器配置檔案也就是solrHome的位置。修改web.xml使用jndi的方式告訴solr伺服器。
Solr/home名稱必須是固定的。
第七步:啟動tomcat
第八步:訪問http://localhost:8080/solr/
Solr後臺管理
管理介面
Dashboard
儀表盤,顯示了該Solr例項開始啟動執行的時間、版本、系統資源、jvm等資訊。
Logging
Solr執行日誌資訊
Cloud
Cloud即SolrCloud,即Solr雲(叢集),當使用Solr Cloud模式執行時會顯示此選單,如下圖是Solr Cloud的管理介面:
Core Admin
Solr Core的管理介面。Solr Core是Solr的一個獨立執行例項單位,它可以對外提供索引和搜尋服務,一個Solr工程可以執行多個SolrCore(Solr例項),一個Core對應一個索引目錄。
新增solrcore:
第一步:複製collection1改名為collection2
第二步:修改core.properties。name=collection2
第三步:重啟tomcat
java properties
Solr在JVM執行環境中的屬性資訊,包括類路徑、檔案編碼、jvm記憶體設定等資訊。
Tread Dump
顯示Solr Server中當前活躍執行緒資訊,同時也可以跟蹤執行緒執行棧資訊。
Core selector
選擇一個SolrCore進行詳細操作,如下:
Analysis
通過此介面可以測試索引分析器和搜尋分析器的執行情況。
Dataimport
可以定義資料匯入處理器,從關係資料庫將資料匯入到Solr索引庫中。
Document
通過此選單可以建立索引、更新索引、刪除索引等操作,介面如下:
/update表示更新索引,solr預設根據id(唯一約束)域來更新Document的內容,如果根據id值搜尋不到id域則會執行新增操作,如果找到則更新。
Query:
通過/select執行搜尋索引,必須指定“q”查詢條件方可搜尋。
配置中文分析器
Schema.xml
schema.xml,在SolrCore的conf目錄下,它是Solr資料表配置檔案,它定義了加入索引的資料的資料型別的。主要包括FieldTypes、Fields和其他的一些預設設定。
FieldType域型別定義
下邊“text_general”是Solr預設提供的FieldType,通過它說明FieldType定義的內容:
FieldType子結點包括:name,class,positionIncrementGap等一些引數:
name:是這個FieldType的名稱
class:是Solr提供的包solr.TextField,solr.TextField允許使用者通過分析器來定製索引和查詢,分析器包括一個分詞器(tokenizer)和多個過濾器(filter)
positionIncrementGap:可選屬性,定義在同一個文件中此型別資料的空白間隔,避免短語匹配錯誤,此值相當於Lucene的短語查詢設定slop值,根據經驗設定為100。
在FieldType定義的時候最重要的就是定義這個型別的資料在建立索引和進行查詢的時候要使用的分析器analyzer,包括分詞和過濾
索引分析器中:使用solr.StandardTokenizerFactory標準分詞器,solr.StopFilterFactory停用詞過濾器,solr.LowerCaseFilterFactory小寫過濾器。
搜尋分析器中:使用solr.StandardTokenizerFactory標準分詞器,solr.StopFilterFactory停用詞過濾器,這裡還用到了solr.SynonymFilterFactory同義詞過濾器。
Field定義
在fields結點內定義具體的Field,filed定義包括name,type(為之前定義過的各種FieldType),indexed(是否被索引),stored(是否被儲存),multiValued(是否儲存多個值)等屬性。
如下:
<field name="name" type="text_general" indexed="true" stored="true"/>
<field name="features" type="text_general" indexed="true" stored="true" multiValued="true"/>
multiValued:該Field如果要儲存多個值時設定為true,solr允許一個Field儲存多個值,比如儲存一個使用者的好友id(多個),商品的圖片(多個,大圖和小圖),通過使用solr查詢要看出返回給客戶端是陣列:
uniqueKey
Solr中預設定義唯一主鍵key為id域,如下:
Solr在刪除、更新索引時使用id域進行判斷,也可以自定義唯一主鍵。
注意在建立索引時必須指定唯一約束。
copyField複製域
copyField複製域,可以將多個Field複製到一個Field中,以便進行統一的檢索:
比如,輸入關鍵字搜尋title標題內容content,
定義title、content、text的域:
根據關鍵字只搜尋text域的內容就相當於搜尋title和content,將title和content複製到text中,如下:
dynamicField(動態欄位)
動態欄位就是不用指定具體的名稱,只要定義欄位名稱的規則,例如定義一個 dynamicField,name為*_i,定義它的type為text,那麼在使用這個欄位的時候,任何以_i結尾的欄位都被認為是符合這個定義的,例如:name_i,gender_i,school_i等。
自定義Field名為:product_title_t,“product_title_t”和scheam.xml中的dynamicField規則匹配成功,如下:
“product_title_t”是以“_t”結尾。
建立索引:
搜尋索引:
安裝中文分詞器
使用IKAnalyzer中文分析器。
第一步:把IKAnalyzer2012FF_u1.jar新增到solr/WEB-INF/lib目錄下。
第二步:複製IKAnalyzer的配置檔案和自定義詞典和停用詞詞典到solr的classpath下。
第三步:在schema.xml中新增一個自定義的fieldType,使用中文分析器。
<!-- IKAnalyzer-->
<fieldType name="text_ik" class="solr.TextField">
<analyzer class="org.wltea.analyzer.lucene.IKAnalyzer"/>
</fieldType>
第四步:定義field,指定field的type屬性為text_ik
<!--IKAnalyzer Field-->
<field name="title_ik" type="text_ik" indexed="true" stored="true" />
<field name="content_ik" type="text_ik" indexed="true" stored="false" multiValued="true"/>
第四步:重啟tomcat
測試:
設定業務系統Field
如果不使用Solr提供的Field可以針對具體的業務需要自定義一套Field,如下是商品資訊Field:
<!--product-->
<field name="product_name" type="text_ik" indexed="true" stored="true"/>
<field name="product_price" type="float" 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" />
<field name="product_catalog_name" type="string" indexed="true" stored="true" />
<field name="product_keywords" type="text_ik" indexed="true" stored="false" multiValued="true"/>
<copyField source="product_name" dest="product_keywords"/>
<copyField source="product_description" dest="product_keywords"/>