1. 程式人生 > 實用技巧 >Solr 入門配置

Solr 入門配置

大多數搜尋引擎應用都必須具有某種搜尋功能,問題是搜尋功能往往是巨大的資源消耗,並且它們由於沉重的資料庫載入而拖垮你的應用的效能。這就是為什麼轉移負載到一個外部的搜尋伺服器是一個不錯的注意,Apache Solr 是一個流行的開源搜尋伺服器,它通過使用類似 REST 的 HTTP API,這就確保你能從幾乎任何程式語言來使用 Solr。

一、什麼是 Solr


Solr 是一個開源搜尋平臺,用於構建搜尋應用程式。它建立在 Lucene(全文搜尋引擎)之上。Solr 是企業級的,快速的和高度可擴充套件的。使用 Solr 構建的應用程式架構非常複雜,可以提高效能。

Solr 可以和 Hadoop 一起使用。由於 Hadoop 處理大量資料,Solr 幫助我們從這些大量的資料中找到所需的資訊。不僅限於搜尋,Solr也可以用於儲存。像其他 NoSql 資料庫一樣,它是一種非關係型資料庫儲存和處理技術。總之,Solr 是一個可擴充套件,可部署,搜尋/儲存引擎,優化搜尋大量以文字為中心的資料。

二、Solr 安裝


【1】安裝 Tomcat,解壓即可;
【2】解壓 Solr;
【3】把 Solr 下的 dist 目錄 solr-4.10.3.war 部署到 Tomcat/webapp 目錄下(去掉版本號)
【4】啟動 Tomcat (自動解壓縮 Solr 的 war 包)
【5】把 Solr 下 example/lib/ext 目錄下的所有 jar 包,新增到 Solr 的工程中(/WEB-INF/lib 目錄)

cp -r /soft/solr/example/lib/ext/. /soft/apache-solr/apache/webapps/solr/WEB-INF/lib/

【6】建立 solrhome 目錄(/soft/solr/solrhome) , Solr 專案下的 /example/solr 目錄就是一個 solrhome。複製此目錄內容到建立的 solrhome目錄中

cp -r /soft/solr/example/solr/. /soft/solr/solrhome/

【7】關聯 solr 及 solrhome (需要修改 Solr 工程的 web.xml 檔案:主要是新增 solrhome 的路徑,以下為 Linux 的安裝示例)solrhome 中的 collection1 可以看做是一個數據庫,

1 <env-entry>
2    <env-entry-name>solr/home</env-entry-name>
3    <env-entry-value>/soft/solr/solrhome</env-entry-value
> 4 <env-entry-type>java.lang.String</env-entry-type> 5 </env-entry>

【8】啟動 Tomcat :測試地址:http://IP:8080/solr/
【9】頁面效果展示:

三、中文分析器 IK Analyzer


IK Analyzer 是一個開源的,基於 java 語言開發的輕量級的中文分詞工具包。最初,它是以開源專案 Luence 為應用主體的,結合詞典分詞和文法分析演算法的中文分片語件。從3.0版本開始, IK 發展為面向 Java 的公用分片語件,獨立於 Lcene 專案,同時提供了對 Lucene 的預設優化實現。在2012版本中,IK 實現了簡單的分詞歧義排除演算法,標誌著 IK 分詞器從單純的詞典分詞向模擬語義分詞衍化

IK Analyzer 配置步驟 :
【1】將 IKAnalyzer2012FF_u1.jar 新增到 solr 工程的 lib 目錄中
【2】在 solr 專案的 WEB-INF 目錄下建立 classes 資料夾(WEB-INF/classes),將擴充套件詞典(mydict.dic)可以對自己定義的詞語,或者網路出現的新詞語,都新增到此檔案中參與分析、形容詞詞典(ext_stopword.dic)配置檔案(IKAnalyzer.cfg.xml)放置到剛才建立的目錄。
【3】修改 solrhome 中的 scheme.xml 檔案,配置一個 FieldType,引入 IKAnalyzer 分詞器配置如下:

1 <fieldType name="text_ik" class="solr.TextField">
2      <analyzer class="org.wltea.analyzer.lucene.IKAnalyzer"/>
3 </fieldType>

【4】結果顯示:

注意:如果傳入的複製域引數中包涵空格需要將空格替換掉(.replace(" ", "")),因為空格會影響分詞器的分詞,導致結果出現空的問題。

四、配置域


域相當於資料庫的表字段,使用者存放資料,因此使用者根據業務去定義相關的 Filed(域),一般來說,每一種對應著一種資料,使用者對同一種資料進行相同的操作。

域的常用屬性(schema.xml 配置檔案中配置域):
● name:指定域的名稱
● type:指定域的型別(可以是自己定義的 fieldType)
● indexed:是否索引(將使用者可能作為查詢欄位的屬性都設定為 true)
● stored:是否儲存(複製域一般只用於查詢,不用於儲存)
● required:是否必須(相當於資料庫中的非空欄位)
● multiValued:是否多值(複製域就是多個欄位的組合,就是需要設定為多個值)

例項:自己在專案中修改 solrhome 的 schema.xml 檔案,設定業務系統的 Field 屬性。為了與系統自帶的 field 區分,我們命名 name 是新增字首 item_

1 <field name="item_goodsid" type="long" indexed="true" stored="true"/>
2 <field name="item_title" type="text_ik" indexed="true" stored="true"/>
3 <field name="item_price" type="double" indexed="true" stored="true"/>
4 <field name="item_image" type="string" indexed="false" stored="true" />
5 <field name="item_category" type="string" indexed="true" stored="true" />
6 <field name="item_seller" type="text_ik" indexed="true" stored="true" />
7 <field name="item_brand" type="string" indexed="true" stored="true" />

五、複製域


複製域的作用就是將一個 Field 的資料複製到另一個域中。如下:copeField 就是一個複製域,source 就是要複製的域,dest 就是目標域。目標域就是我們定義的一個用於後續查詢的複製域

1 <field name="item_keywords" type="text_ik" indexed="true" stored="false" multiValued="true"/>
2 <copyField source="item_title" dest="item_keywords"/>
3 <copyField source="item_category" dest="item_keywords"/>
4 <copyField source="item_seller" dest="item_keywords"/>
5 <copyField source="item_brand" dest="item_keywords"/>

六、動態域


當系統中存在不確定的值時,例如:商品中的規格,會根據不同的商品型別(手機、電視等)進行變化。因此就需要動態擴充欄位,我們就需要用到動態域來實現,需要在 schema.xml 檔案中 新增如下資訊以及示例展示:

<dynamicField name="item_spec_*" type="string" indexed="true" stored="true" />