1、 SOLR搭建企業搜索平臺
運行環境:
運行容器:Tomcat6.0.20
Solr版本:apache-solr-1.4.0
分詞器:mmseg4j-1.6.2
詞庫:sogou-dic
準備工做:
下載tomcat 6.0.20:http://tomcat.apache.org/download-60.cgi
下載solr:http://apache.etoak.com/lucene/solr/1.4.0/
詳情請見:http://wiki.apache.org/solr/Solr1.4
下載分詞器:http://code.google.com/p/mmseg4j/
下載sougou詞庫:
http://code.google.com/p/mmseg4j/downloads/detail?name=sogou-dic-utf8.zip&can=2&q=
開始配置:
一、安裝tomcat
二、將下載的solr包下面的dist文件夾中的apache-solr-1.4.0.war 拷貝到 tomcat的webapps 而且更名爲 solr.war 通常狀況下會自動生成相應的文件夾。
三、新建一個 solr-tomcat文件夾,我是把這個文件夾創建在C盤根目錄,你能夠採用一樣方式,也能夠不這樣,放哪由你決定。 創建好該文件夾之後,在把它下面在創建一個solr文件夾,把下載的solr包裏面的example\solr文件夾下面的全部文件放入到 solr裏面。
四、最後一步 配置 solr.home,能夠有三種方式。
1)基於當前路徑的方式
這種狀況須要在c:\solr-tomcat\目錄下去啓動tomcat,Solr查找./solr,所以在啓動時候須要切換到c:\solr- tomcat\
2)基於環境變量
windows在環境變量中創建solr.home,值爲c:\solr-tomcat
linux在當前用戶的環境變量中(.bash_profile)或在catalina.sh中添加以下環境變量
export JAVA_OPTS="$JAVA_OPTS -Dsolr.solr.home=/opt/solr-tomcat/solr"
3)基於JNDI
在tomcat的conf文件夾創建Catalina文件夾,而後在Catalina文件夾中在創建localhost文件夾,在該文件夾下面創建 solr.xml,其中內容:
<Context docBase="C:/Program Files/Apache Software Foundation/Tomcat 6.0/webapps/solr" debug="0" crossContext="true" >
<Environment name="solr/home" type="java.lang.String" value="c:/solr-tomcat/solr" override="true" />
</Context>
五、打開瀏覽器 輸入:http://localhost:8080/solr/admin/ (其中的端口根據狀況輸入 默認是8080) 就能夠訪問solr服務了
六、若是出現以下圖示,表示配置成功。
2、 SOLR搭建企業搜索平臺--中文分詞
這篇文章,主要說的是 怎麼在solr中加入中文分詞
一、下載分詞器:http://code.google.com/p/mmseg4j/
二、將解壓後的mmseg4j-1.8.2目錄下的mmseg4j-all-1.8.2.jar拷貝到Tomcat _HOME\webapps\solr\WEB-INF\lib目錄下。
三、添加詞庫:在C:\solr-tomcat\solr目錄下新建dic文件夾,將解壓後的sogou-dic\data目錄下的 words.dic拷貝到C:\solr-tomcat\solr\dic目錄下。
四、更改schema.xml(c:\solr-tomcat\solr\conf\)文件,使分詞器起到做用。
更改內容爲:
<types>
……
<!--mmseg4j field types-->
<fieldType name="textComplex" class="solr.TextField" positionIncrementGap="100" >
<analyzer>
<tokenizer class="com.chenlb.mmseg4j.solr.MMSegTokenizerFactory" mode="complex" dicPath="C:\solr-tomcat\solr\dic"/>
<filter class="solr.LowerCaseFilterFactory"/>
</analyzer>
</fieldType>
<fieldType name="textMaxWord" class="solr.TextField" positionIncrementGap="100" >
<analyzer>
<tokenizer class="com.chenlb.mmseg4j.solr.MMSegTokenizerFactory" mode="max-word" dicPath="C:\solr-tomcat\solr\dic"/>
<filter class="solr.LowerCaseFilterFactory"/>
</analyzer>
</fieldType>
<fieldType name="textSimple" class="solr.TextField" positionIncrementGap="100" >
<analyzer>
<tokenizer class="com.chenlb.mmseg4j.solr.MMSegTokenizerFactory" mode="simple" dicPath="C:\solr-tomcat\solr\dic"/>
<filter class="solr.LowerCaseFilterFactory"/>
</analyzer>
</fieldType>
……
</types>
注:dicPath="C:\solr-tomcat\solr\dic"是你的詞庫路徑,個人是放在了C:\solr-tomcat\solr\dic目錄下。
<fields>
……
<field name="simple" type="textSimple" indexed="true" stored="true" multiValued="true"/>
<field name="complex" type="textComplex" indexed="true" stored="true" multiValued="true"/>
<field name="text" type="textMaxWord" indexed="true" stored="true" multiValued="true"/>
……
</fields>
<copyField source="simple" dest="text"/>
<copyField source="complex" dest="text"/>
重啓你的tomcat。
訪問:http://localhost:8089/solr/admin/analysis.jsp能夠看 mmseg4j 的分詞效果。在 Field 的下拉菜單選擇 name,而後在應用輸入 complex。分詞的結果,以下圖:
好了,能夠運行起來了,那就添加個文檔試下,在 解壓後的apache-solr-1.4.0\example\exampledocs目錄下建立 mmseg4j-solr-demo-doc.xml 文檔,內容以下:
<add>
<doc>
<field name="id">1</field>
<field name="text">昨日,記者從解放軍總參謀部相關部門獲悉,截至3月28日,解放軍和武警部隊累計出動7.2萬人次官兵支援地方抗旱救災。 組織民兵預備役人員20.2萬人 次支援地方抗旱救災。</field>
</doc>
<doc>
<field name="id">2</field>
<field name="text">下半年房價調整就是擠水分 房價回不到去年水平。</field>
</doc>
<doc>
<field name="id">3</field>
<field name="text">solr是基於Lucene Java搜索庫的企業級全文搜索引擎,目前是apache的一個項目。</field>
</doc>
<doc>
<field name="id">4</field>
<field name="text">中國人民銀行是中華人民共和國的中央銀行。</field>
</doc>
</add>
而後在 cmd 下運行 post.jar,以下:
F:\lucene\solr\apache-solr-1.4.0\example\exampledocs>java -Durl=http://localhost:8089/solr/update -Dcommit=yes -jar post.jar mmseg4j-solr-demo-doc.xml
查看是否有數據,訪問:http://localhost:8089/solr/admin/ 在Query String: 中輸入「中國」,顯示以下圖所示:
到這裏,分詞成功。至於schema.xml中的配置屬性會在下一章中進行詳細的介紹。
[Solr分詞順序]
Solr創建索引和對關鍵詞進行查詢都得對字串進行分詞,在向索引庫中添加全文檢索類型的索引的時候,Solr會首先用空格進行分詞,而後把分詞結果依次使用指定的過濾器進行過濾,最後剩下的結果纔會加入到索引庫中以備查詢。分詞的順序以下:
索引
1:空格whitespaceTokenize
2:過濾詞(停用詞,如:on、of、a、an等) StopFilter
3:拆字WordDelimiterFilter
4:小寫過濾LowerCaseFilter
5:英文相近詞EnglishPorterFilter
6:去除重複詞RemoveDuplicatesTokenFilter
查詢
1:查詢相近詞
2:過濾詞
3:拆字
4:小寫過濾
5:英文相近詞
6:去除重複詞
以上是針對英文,中文的除了空格,其餘都相似。
3、 SOLR搭建企業搜索平臺—配置文件詳解
在solr裏面主要的就是solr的主目錄下面的schema.xml,solrConfig.xml。
首先:schema.xml
schema.xml,這個至關於數據表配置文件,它定義了加入索引的數據的數據類型的。主要包括types、fields和其餘的一些缺省設置。
一、首先須要在types結點內定義一個FieldType子結點,包括name,class,positionIncrementGap等等一 些參數,name就是這個FieldType的名稱,class指向org.apache.solr.analysis包裏面對應的class名稱,用來 定義這個類型的行爲。在FieldType定義的時候最重要的就是定義這個類型的數據在創建索引和進行查詢的時候要使用的分析器analyzer,包括分 詞和過濾。例如:
<fieldType name="text" class="solr.TextField" positionIncrementGap="100">
<analyzer type="index">
<tokenizer class="solr.WhitespaceTokenizerFactory"/>
<!-- in this example, we will only use synonyms at query time
<filter class="solr.SynonymFilterFactory" synonyms="index_synonyms.txt" ignoreCase="true" expand="false"/>
-->
<!-- Case insensitive stop word removal.
enablePositionIncrements=true ensures that a 'gap' is left to
allow for accurate phrase queries.
-->
<filter class="solr.StopFilterFactory"
ignoreCase="true"
words="stopwords.txt"
enablePositionIncrements="true"
/>
<filter class="solr.WordDelimiterFilterFactory" generateWordParts="1" generateNumberParts="1" catenateWords="1" catenateNumbers="1" catenateAll="0" splitOnCaseChange="1"/>
<filter class="solr.LowerCaseFilterFactory"/>
<filter class="solr.EnglishPorterFilterFactory" protected="protwords.txt"/>
<filter class="solr.RemoveDuplicatesTokenFilterFactory"/>
</analyzer>
……
</fieldType>
在index的analyzer中使用 solr.WhitespaceTokenizerFactory這個分詞包,就是空格分詞,而後使用 solr.StopFilterFactory,solr.WordDelimiterFilterFactory,solr.LowerCaseFilterFactory,solr.EnglishPorterFilterFactory,solr.RemoveDuplicatesTokenFilterFactory 這幾個過濾器。在向索引庫中添加text類型的索引的時候,Solr會首先用空格進行分詞,而後把分詞結果依次使用指定的過濾器進行過濾,最後剩下的結果 纔會加入到索引庫中以備查詢。Solr的analysis包並無帶支持中文的包,在第二篇文章中詳細講了怎樣添加mmseg4j中文分詞器,詳情請參見 http://dzq2008.iteye.com/blog/641548
二、接下來的工做就是在fields結點內定義具體的字段(相似數據庫中的字段),就是filed,filed定義包括name,type(爲之 前定義過的各類FieldType),indexed(是否被索引),stored(是否被儲存),multiValued(是否有多個值)等等。
例:
<fields>
<field name="id" type="integer" indexed="true" stored="true" required="true" />
<field name="name" type="text" indexed="true" stored="true" />
<field name="summary" type="text" indexed="true" stored="true" />
<field name="author" type="string" indexed="true" stored="true" />
<field name="date" type="date" indexed="false" stored="true" />
<field name="content" type="text" indexed="true" stored="false" />
<field name="keywords" type="keyword_text" indexed="true" stored="false" multiValued="true" />
<field name="all" type="text" indexed="true" stored="false" multiValued="true"/>
</fields>
field的定義至關重要,有幾個技巧需注意一下,對可能存在多值得字段儘可能設置 multiValued屬性爲true,避免建索引是拋出錯誤;若是不須要存儲相應字段值,儘可能將stored屬性設爲false。
三、建議創建了一個拷貝字段,將全部的全文字段複製到一個字段中,以便進行統一的檢索:
<field name="all" type="text" indexed="true" stored="false" multiValued="true"/>
並在拷貝字段結點處完成拷貝設置:
<copyField source="name" dest="all"/>
<copyField source="summary" dest="all"/>
注:「拷貝字段」就是查詢的時候不用再輸入:userName:張三 and userProfile:張三的我的簡介。直接能夠輸入"張三"就能夠將「名字」含「張三」或者「簡介」中含「張三」的又或者「名字」和「簡介」都含有 「張三」的查詢出來。他將須要查詢的內容放在了一個字段中,而且默認查詢該字段設爲該字段就好了。
四、除此以外,還能夠定義動態字段,所謂動態字段就是不用指定具體的名稱,只要定義字段名稱的規則,例如定義一個 dynamicField,name 爲*_i,定義它的type爲text,那麼在使用這個字段的時候,任何以_i結尾的字段都被認爲是符合這個定義的,例 如:name_i,gender_i,school_i等。
schema.xml配置文件大致上就是這樣,更多細節請參見solr wiki http://wiki.apache.org/solr/SchemaXml。
4、 SOLR搭建企業搜索平臺--MultiCore
Solr Multicore 是 solr 1.3 的新特性。其目的一個solr實例,能夠有多個搜索應用。
咱們知道你既能夠把不一樣類型的數據放到同一index中,也可使用分開的多indexes。基於這一點,你只需知道如何使用多 indexes(實際上就是運行Solr的多實例)。儘管如此,爲每個類型添加一個完整的Solr實例會顯得太臃腫龐大。Solr1.3引入了Solr core的概念,該方案使用一個Solr實例管理多個indexes,這樣就有熱點core(hot core)的重讀(reloading)與交換(swap,一般是讀index與寫index交換),那麼管理一個 core或index也容易些。每一個Solr core由它本身的配置文件和索引數據組成。在多core執行搜索和索引幾乎和沒有使用core同樣。你只是添加core的名字爲各自不一樣的URL。單 core狀況下的以下搜索:
http://localhost:8983/solr/select?q=dave%20matthews
在多core環境下,你能夠經過以下方式訪問一個名爲mbartists的core:
http://localhost:8983/solr/core0/select?q=dave%20matthews
並不是在URL中引入core name的參數名值對,而是用不一樣的context。這樣就能夠像在單core中執行你的管理任務,搜索,更新操做。
一、找到solr下載包中的example文件夾,在它的下面有個multicore文件夾,將這個文件夾下面的core0、core1和solr.xml拷貝到 c:\solr-tomcat\solr下面。
注意:有一個 solr.xml(這只是默認文件,固然也能夠指定別的文件),如:
<?xml version="1.0" encoding="UTF-8" ?>
<solr persistent="false">
<cores adminPath="/admin/cores">
<core name="core0" instanceDir="core0" />
<core name="core1" instanceDir="core1" />
</cores>
</solr>
這個文件是告訴solr應該加載哪些core,<cores>……</cores>裏有 core0、core1。core0(能夠類比之前的solr.home)/conf目錄下有schema.xml與solrconfig.xml,能夠 把實際應用的複製過來。
二、啓動tomcat,訪問應用,就能夠看到有 Admin core0 和 Admin core1
三、採用上面的默認solr.xml,索引文件將存放在同一個目錄下面,在這裏將存放在C:\solr-tomcat\solr\data,若是你想更改目錄,或者兩個應用存放在不一樣的目錄,請參見下面的xml。
<core name="core0" instanceDir="core0">
<property name="dataDir" value="/data/core0" />
</core>
一些關鍵的配置值是:
1.Persistent="false"指明運行時的任何修改咱們不作保存。如拷貝。若是你想保存從啓動起的一些改動,那就把 persistent設置爲true。若是你的index策略是完成建index到一個純淨的core中而後交換到活動core 那麼你絕對應該設爲true。
sharedLib="lib"指明瞭全部core的jar文件的lib目錄。若是你有一個core有本身須要的jar文件,那麼你能夠把他們置 入到core/lib目錄。例如:karaoke core 使用 Solr Cell來索引化富文本內容,所以那些用來解析和抽取富文本的jar文件被放到./examples/cores/karaoke/lib/.
爲什麼使用多core ?
Solr實例支持多core比啓用多index要好(do more)。多core同時解決了在生產環境下的一些關鍵需求:
1.重建索引
2.測試配置變動
3.合併索引
4.運行時重命名core
爲什麼多core不是默認的?
多core是1.3版本中才加的,1.4後更成熟。咱們強烈建議你使用多core,既是你如今的solr.xml只配置了一個core,雖然會比 單個索引稍複雜,但能夠帶來管理core上的好處。或許一天單個core可能最終RELOAD and STATUS命令,又或許單個core最終會被廢禁。多個core會是Solr未來支持大規模分佈式索引的關鍵。所以,之後能夠期待更多。
你能夠獲得更多的關於Solr的資料:http://wiki.apache.org/solr/CoreAdmin.
5、 SOLR搭建企業搜索平臺--查詢參數說明
在作solr查詢的時候,solr提供了不少參數來擴展它自身的強大功能!如下是使用頻率最高的一些參數!
一、經常使用
q - 查詢字符串,必須的。查詢語句(相似SQL) 相關詳細的操做還需lucene 的query 語法
fl - 指定返回那些字段內容,用逗號或空格分隔多個。
start - 返回第一條記錄在完整找到結果中的偏移位置,0開始,通常分頁用。
rows - 指定返回結果最多有多少條記錄,配合start來實現分頁。
sort - 排序,格式:sort=<field name>+<desc|asc>[,<field name>+<desc|asc>]… 。示例:(score desc, price asc)表示先 「score」 降序, 再 「price」 升序,默認是相關性降序。
wt - (writer type)指定輸出格式,能夠有 xml, json, php, phps, 後面 solr 1.3增長的,要用通知咱們,由於默認沒有打開。
fl表示索引顯示那些field(*表示全部field, score 是solr 的一個匹配熱度)
q.op 表示q 中 查詢語句的 各條件的邏輯操做 AND(與) OR(或)
hl 是否高亮
hl.fl 高亮field
hl.snippets 不太清楚(反正是設置高亮3就能夠了)
hl.simple.pre 高亮前面的格式
hl.simple.post 高亮後面的格式
facet 是否啓動統計
facet.field 統計field
fq - (filter query)過慮查詢,做用:在q查詢符合結果中同時是fq查詢符合的,例如:q=mm&fq=date_time:[20081001 TO 20091031],找關鍵字mm,而且date_time是20081001到20091031之間的。官方文 檔:http://wiki.apache.org/solr/CommonQueryParameters#head- 6522ef80f22d0e50d2f12ec487758577506d6002
二、不經常使用
q.op - 覆蓋schema.xml的defaultOperator(有空格時用"AND"仍是用"OR"操做邏輯),通常默認指定
df - 默認的查詢字段,通常默認指定
qt - (query type)指定那個類型來處理查詢請求,通常不用指定,默認是standard。
三、其它
indent - 返回的結果是否縮進,默認關閉,用 indent=true|on 開啓,通常調試json,php,phps,ruby輸出纔有必要用這個參數。
version - 查詢語法的版本,建議不使用它,由服務器指定默認值。
6、 SOLR搭建企業搜索平臺--Solr查詢語法
solr的一些查詢語法
一、首先假設個人數據裏fields有:name, tel, address 預設的搜尋是name這個字段, 若是要搜尋的數據恰好就是 name 這個字段,就不須要指定搜尋字段名稱。
二、查詢規則:
如欲查詢特定字段(非預設字段),請在查詢詞前加上該字段名稱加 「:」 (不包含」號) 符號,
例如: address:北京市海淀區上地軟件園 tel:88xxxxx1
1>. q表明query input
2>. version表明solr版本(建議不要變更此變量)
3>. start表明顯示結果從哪一筆結果資料開始,預設爲0表明第一筆, rows是說要顯示幾筆數據,預設爲10筆
(由於有時查詢結果可能有幾百筆,但不須要顯示全部結果,因此預設是從第一筆開始到第十筆)
因此若要顯示第10到30筆就改成:
http: //localhost:8080/solr/select/?indent=on&version=2.2&q=address:北京 市海淀區上地軟件園+tel:88xxxxx1&version=2.2&start=10&rows= 20&indent=on
(indent表明輸出的xml要不要縮行.預設爲開啓 on)
三、另外,要限定輸出結果的內容可用 「fl=」 加上你要的字段名稱,如如下這個範例:
http: //localhost:8080/solr/select/?indent=on&version=2.2&q=text:北京+ OR+text:億度&start=0&rows=10&fl=name,address,tel
在fl=以後加上了name,adress,tel
因此結果會以下:
<result name=」response」 numFound=」1340″ start=」0″>
<doc>
<str name=」name」>北京億度</str>
<str name=」address」>北京市海淀區上地軟件園</str>
<str name=」tel」>88xxxxxx1</str>
</doc>
<doc>
<str name=」name」>北京億度</str>
<str name=」address」/>
<str name=」tel」>88xxxxxx1</str>
</doc>
</result>
四、查詢 name 或 address:直接輸入查詢詞, 如: 億度
送出的內容即爲:
name:億度 AND address:海淀
五、若要搜尋聯集結果,請在詞與詞間空格或加上大寫 「OR」 (不包含」號).
例如: text:海淀 OR text:億度
text:海淀 OR 億度
或
海淀 億度
或
name:億度 OR tel:88xxxxxx1
或
name:億度 tel:88xxxxxx1
六、若要搜尋交集結果,請在詞與詞間加上大寫 「AND」 或 「+」 (不包含」號).
例如: text:海淀 AND 億度
或
+text:海淀 +text:億度
或
name:億度 AND tel:88xxxxxx1
或
name: ( +億度 +海淀)
七、排除查詢
在要排除的詞前加上 「-」 (不包含」號) 號
例如: 海淀 -億度
搜尋結果不會有包含億度的詞的結果在內
八、Group 搜尋
使用 「()」 來包含一個group
如但願搜尋在店名字段內同時有 「臺北」(不包含」號) 及 「火車站」(不包含」號)
九、增長權重: 如要搜尋 「北京 加油站」(不包含」號) 但由於回傳太多筆資料內有 「中華」(不包含」號) 或 「加油站」(不包含」號) 的結果,
因此想要把有包含 「加油站」(不包含」號)的數據往前排,可以使用 「^」(不包含」號)符號在後面加上愈增長的權重數,
像是 「2″,則能夠這樣作:
北京 加油站^2
會同時搜尋含有北京或加油站的結果,並把加油站這個詞加權因此搜尋時會先判斷加油站這一個詞在搜尋結果中的比重,甚至假設一筆數據內加油站出現過兩次以上的就更加會有優先權。
查詢時在查詢詞後加上 「^」 (不包含」號) 再加上權重分數
例如: 億度 AND 「北京」^2
或
億度^2 OR 北京
十、Wildcard 搜尋使用 「*」 符號; 若是輸入 「中國*銀」 (不包含」號), 結果會有中國信託商業銀行, 中國輸出入銀行圖書閱覽室, 中國商銀證券
中國及銀之間可夾任何長短字詞.
7、 SOLR搭建企業搜索平臺--數據庫數據導入到Solr
詳細請參考地址:http://rq2-79.iteye.com/blog/516429
寫程序能夠將數據讀出100條,若是你的內存夠大,能夠是1000條甚至更多,而後放入Collection中,批量提交至solr。或者讀取數據寫入xml文件中,再將該文件提交到solr等等。可是,咱們還能夠經過配置文件直接讀取數據庫創建索引。
1、提供對應數據庫的jdbc驅動。
將jdbc驅動放在TOMCAT_HOME\webapps\solr\WEB-INF\lib目錄下。
2、在C:\solr-tomcat\solr\conf目錄下新建db文件夾,在db文件夾中新建db-data-config.xml內容以下:
<dataConfig>
<dataSource type="JdbcDataSource" driver="oracle.jdbc.driver.OracleDriver" url="jdbc:oracle:thin:@192.168.1.1:1521:數據庫名" user="用戶名" password="密碼"/>
<document name="messages">
<entity name="message" transformer="ClobTransformer" query="select * from tb_message">
<field column="ID" name="id" />
<field column="TITLE" name="title"/>
<field column="CONTENT" clob="true" name="content" />
<field column="SENDTIME" name="sendtime" />
</entity>
</document>
</dataConfig>
3、修改C:\solr-tomcat\solr\conf目錄下的solrconfig.xml文件。在相應的位置添加以下代碼:
<!-- DataImportHandler -->
<requestHandler name="/dataimport" class="org.apache.solr.handler.dataimport.DataImportHandler">
<lst name="defaults">
<str name="config">C:\solr-tomcat\solr\conf\db\db-data-config.xml</str>
</lst>
</requestHandler>
注:C:\solr-tomcat\solr\conf\db\db-data-config.xml是db-data-config.xml的存放路徑,你要根據實際狀況而定。
document:一個文檔也就是lucene的document這個沒什麼解釋的。
entity:主要針對的是一個數據庫表。
filed:屬性column是數據庫的字段,name是filed的名字,即schema中的field name。
column必須大寫
更多請參考官方wiki:http://wiki.apache.org/solr/DataImportHandler
4、啓動TOMCAT,輸入地址進行導入,導入分爲多種模式:我用的是徹底導入模式。
http://localhost:8089/solr/dataimport?command=full-import
結果:
00C:\solr-tomcat\solr\conf\db\db-data-config.xmlfull-importidle1202009-09-05 21:28:08Indexing completed. Added/Updated: 2 documents. Deleted 0 documents.2009-09-05 21:28:092009-09-05 21:28:090:0:0.579This response format is experimental. It is likely to change in the future.
5、再去查詢你剛纔提交的數據。
上面的例子只不過是很簡單的一個部分。針對solr的 MultiCore,經過配置db-data-config.xml也能夠實現,還有多表,或者多表關聯等等操做只要在db-data- config.xml配置清楚均可以進行數據的導入。
在solr1.4中還有更多的擴展功能,這些功能爲重建索引提供能很方便的操做。並且,datasource不僅僅指的是database,能夠是xml文件,還能夠是來自網絡上的等等。
8、 SOLR搭建企業搜索平臺—增量更新索引
一、首先要確認表中有last_modified字段。
二、修改C:\solr-tomcat\solr\conf\db\db-data-config.xml文件,內容以下:
<dataConfig>
<dataSource type="JdbcDataSource" driver="oracle.jdbc.driver.OracleDriver" url="jdbc:oracle:thin:@192.168.1.1:1521:數據庫名" user="用戶名" password="密碼"/>
<document name="messages">
<entity name="message" pk="ID"
transformer="ClobTransformer"
query="select * from tb_message"
deltaQuery="select id from tb_message where to_char(last_modified,'YYYY-MM-DD HH24:MI:SS') > '${dataimporter.last_index_time}'">
<field column="ID" name="id" />
<field column="TITLE" name="title" />
<field column="CONTENT" clob="true" name="content" />
<field column="SENDTIME" name="sendtime" />
</entity>
</document>
</dataConfig>
三、重啓tomcat。添加一條記錄。
訪問:http://localhost:8089/solr/dataimport?command=delta-import
再查詢一下,是否是能夠查詢到剛纔添加的記錄了。
9、 SOLR搭建企業搜索平臺--字段增長權重
在不少時候,咱們可能會須要增長某一個字段的權重,以合理的顯示搜索結果。
例如:有一個schma,有三個字段:chapterId, title, content.
咱們但願某一個關鍵字若是在title中匹配了,就要優先顯示,而在content中匹配了,就放在搜索結果的後面。固然,若是二者同時匹配固然沒什麼好說的了。看看solr中如何作到吧。
title:(test1 test2)^4 content:(test1 test2)
給title字段增長權重,優先匹配
關於^後面的數字4,通過我測試,最佳值應該是有n個字段就寫成n+1,固然但願你們能更好的去測試!
10、 SOLR搭建企業搜索平臺-- Solr分詞器、過濾器、分析器
關於lucene的分析器,分詞器,過濾器,請看:http://lianj-lee.iteye.com/blog/501247
對一個document進行索引時,其中的每一個field中的數據都會經歷分析(根據上面的一個博客能夠知道,分析就是組合分詞和過濾),最終將一句話分紅單個的單詞,去掉句子當中的空白符號,大寫轉換小寫,複數轉單數,去掉多餘的詞,進行同義詞代換等等。
如:This is a blog! this, is, a 會被去除,最後最剩下blog。固然!這個符號也會被去除的。
這個過程是在索引和查詢過程當中都會進行的,並且一般二者進行的處理的都是同樣的,這樣作是爲了保證創建的索引和查詢的正確匹配。
分析器(Analyzer)
分析器是包括兩個部分:分詞器和過濾器。分詞器功能將句子分紅單個的詞元token,過濾器就是對詞元進行過濾。
solr自帶了一些分詞器,若是你須要使用自定義的分詞器,那麼就須要修改schema.xml文件。
schema.xml 文件容許兩種方式修改文本被分析的方式,一般只有field類型爲 solr.TextField 的field的內容容許定製分析器。
方法一:使用任何 org.apache.lucene.analysis.Analyzer的子類進行設定。
<fieldType name="text" class="solr.TextField">
<analyzer class="org.wltea.analyzer.lucene.IKAnalyzer"/>
</fieldType>
方法二:指定一個TokenizerFactory ,後面跟一系列的TokenFilterFactories(它們將按照所列的順序發生做用),Factories被用來建立分詞器和分詞過濾器,它們用 於對分詞器和分詞過濾器的準備配置,這樣作的目的是爲了不the overhead of creation via reflection。
<analyzer type="index">
<tokenizer class="org.wltea.analyzer.solr.IKTokenizerFactory" isMaxWordLength="false"/>
……
</analyzer>
<analyzer type="query">
<tokenizer class="org.wltea.analyzer.solr.IKTokenizerFactory" isMaxWordLength="true"/>
……
</analyzer>
須要說明的一點是,Any Analyzer, TokenizerFactory, or TokenFilterFactory 應該用帶包名的全類名進行指定,請確保它們位於Solr的classpath 路徑下。對於 org.apache.solr.analysis.* 包下的類,僅僅經過solr.*就能夠進行指定。
若是你須要使用本身的分詞器和過濾器,你就須要本身寫一個 factory ,它必須是 BaseTokenizerFactory(分詞器) 或BaseTokenFilterFactory(過濾器)的子類。就像下面同樣。
public class MyFilterFactory extends BaseTokenFilterFactory {
public TokenStream create(TokenStream input) {
return new MyFilter(input);
}
}
對於IK3.1.5版本已經徹底支持了solr的分詞,這樣就不用本身來編寫了, 而對於中文的切詞的話,ik對solr的支持已經很完美了。
Solr提供了哪些TokenizerFactories?
1. solr.LetterTokenizerFactory
建立org.apache.lucene.analysis.LetterTokenizer.
分詞舉例:
"I can't" ==> "I", "can", "t",字母切詞。
2. solr.WhitespaceTokenizerFactory
建立org.apache.lucene.analysis.WhitespaceTokenizer,主要是切除全部空白字符。
3. solr.LowerCaseTokenizerFactory
建立org.apache.lucene.analysis.LowerCaseTokenizer
分詞舉例:
"I can't" ==> "i", "can", "t",主要是大寫轉小寫。
4. solr.StandardTokenizerFactory
建立org.apache.lucene.analysis.standard.StandardTokenizer
分詞舉例: "I.B.M. cat's can't" ==>
ACRONYM: "I.B.M.", APOSTROPHE:"cat's", APOSTROPHE:"can't"
說明:該分詞器,會自動地給每一個分詞添加type,以便接下來的對type敏感的過濾器進行處理,目前僅僅只有StandardFilter對Token 的類型是敏感的。
5. solr.HTMLStripWhitespaceTokenizerFactory
從結果中除去HTML標籤,將結果交給WhitespaceTokenizer處理。
例子:
my <a href="www.foo.bar">link</a>
my link
<?xml?><br>hello<!--comment-->
hello
hello<script><-- f('<--internal--></script>'); --></script>
hello
if a<b then print a;
if a<b then print a;
hello <td height=22 nowrap align="left">
hello
a<b A Alpha&Omega Ω
a<b A Alpha&Omega Ω
6. solr.HTMLStripStandardTokenizerFactory
從結果中出去HTML標籤,將結果交給StandardTokenizer處理。
7. solr.PatternTokenizerFactory
說明:按照規則表達式樣式對分本進行分詞。
例子:處理對象爲,mice; kittens; dogs,他們由分號加上一個或多個的空格分隔。
<fieldType name="semicolonDelimited" class="solr.TextField">
<analyzer>
<tokenizer class="solr.PatternTokenizerFactory" pattern="; *" />
</analyzer>
</fieldType>
Solr有哪些TokenFilterFactories?
1. solr.StandardFilterFactory
建立:org.apache.lucene.analysis.standard.StandardFilter.
移除首字母簡寫中的點和Token後面的’s。僅僅做用於有類的Token,他們是由StandardTokenizer產生的。
例:StandardTokenizer+ StandardFilter
"I.B.M. cat's can't" ==> "IBM", "cat", "can't"
2. solr.LowerCaseFilterFactory
建立:org.apache.lucene.analysis.LowerCaseFilter.
3. solr.TrimFilterFactory【solr1.2】
建立:org.apache.solr.analysis.TrimFilter
去掉Token兩端的空白符
例:
" Kittens! ", "Duck" ==> "Kittens!", "Duck".
4. solr.StopFilterFactory
建立:org.apache.lucene.analysis.StopFilter
去掉以下的通用詞,多爲虛詞。
"a", "an", "and", "are", "as", "at", "be", "but", "by",
"for", "if", "in", "into", "is", "it",
"no", "not", "of", "on", "or", "s", "such",
"t", "that", "the", "their", "then", "there", "these",
"they", "this", "to", "was", "will", "with"
自定義的通用詞表的使用能夠經過schema.xml文件中的"words"屬性來指定,以下。
<fieldtype name="teststop" class="solr.TextField">
<analyzer>
<tokenizer class="solr.LowerCaseTokenizerFactory"/>
<filter class="solr.StopFilterFactory" words="stopwords.txt" ignoreCase="true"/>
</analyzer>
</fieldtype>
5. solr.KeepWordFilterFactory【solr1.3】
建立:org.apache.solr.analysis.KeepWordFilter
做用與solr.StopFilterFactory相反,保留詞的列表也能夠經過」word」屬性進行指定。
<fieldtype name="testkeep" class="solr.TextField">
<analyzer>
<filter class="solr.KeepWordFilterFactory" words="keepwords.txt" ignoreCase="true"/>
</analyzer>
</fieldtype>
6. solr.LengthFilterFactory
建立:solr.LengthFilter
過濾掉長度在某個範圍以外的詞。範圍設定方式見下面。
<fieldtype name="lengthfilt" class="solr.TextField">
<analyzer>
<tokenizer class="solr.WhitespaceTokenizerFactory"/>
<filter class="solr.LengthFilterFactory" min="2" max="5" />
</analyzer>
</fieldtype>
7. solr.PorterStemFilterFactory
建立:org.apache.lucene.analysis.PorterStemFilter
採用Porter Stemming Algorithm算法去掉單詞的後綴,例如將複數形式變成單數形式,第三人稱動詞變成第一人稱,如今分詞變成通常如今時的動詞。
8. solr.EnglishPorterFilterFactory
建立:solr.EnglishPorterFilter
關於句子主幹的處理,其中的"protected"指定不容許修改的詞的文件。
9. solr.SnowballPorterFilterFactory
關於不一樣語言的詞幹處理
10.solr.WordDelimiterFilterFactory
關於分隔符的處理。
11.solr.SynonymFilterFactory
關於同義詞的處理。
12.solr.RemoveDuplicatesTokenFilterFactory
避免重複處理。
11、 SOLR搭建企業搜索平臺-- Solr高亮使用
一、SolrQuery類,此類有方法setHighlight(true),當設置爲true時,表示開啓了高亮。
二、SolrQuery類,有方法:
// 如下給兩個字段開啓了高亮,分別是name,description,
query.addHighlightField("name");
query.addHighlightField("description");
// 如下兩個方法主要是在高亮的關鍵字先後加上html代碼
query.setHighlightSimplePre("<font color=\"red\">");
query.setHighlightSimplePost("</font>");
三、下面是獲取高亮的內容:
Map<String,Map<String,List<String>>> map = response.getHighlighting();
Map的Key爲document的Id,即你在schema.xml中設置的Id,Value爲該Id對應的document的值,Value 也爲一個Map,該Map的Key爲fieldName,Value爲List<String>,這個List裏面的內容就是該文檔的高亮字 段。
因此當作邏輯處理的時候,只要按照這個層次,依次把東西給取出來便可,若是取出來的東西爲空,則用QueryResponse中的 SolrDocument的getFieldValue(filedName)的值。
對了,請注意在solrConfig.xml中開啓高亮組件,這個能夠看看官方wiki或者看solrconfig.xml中註釋!
12、 SOLR搭建企業搜索平臺-- Solr的檢索運算符
1. 「:」 指定字段查指定值,如返回全部值*:*
2. 「?」 表示單個任意字符的通配
3. 「*」 表示多個任意字符的通配(不能在檢索的項開始使用*或者?符號)
4. 「~」 表示模糊檢索,如檢索拼寫相似於」roam」的項這樣寫:roam~將找到形如foam和roams的單詞;roam~0.8,檢索返回類似度在0.8以上的記錄。
5. 鄰近檢索,如檢索相隔10個單詞的」apache」和」jakarta」,」jakarta apache」~10
6. 「^」 控制相關度檢索,如檢索jakarta apache,同時但願去讓」jakarta」的相關度更加好,那麼在其後加上」^」符號和增量值,即jakarta^4 apache
7. 布爾操做符AND、||
8. 布爾操做符OR、&&
9. 布爾操做符NOT、!、- (排除操做符不能單獨與項使用構成查詢)
10.「+」 存在操做符,要求符號」+」後的項必須在文檔相應的域中存在
11. ( ) 用於構成子查詢
12. [] 包含範圍檢索,如檢索某時間段記錄,包含頭尾,date:[200707 TO 200710]
13. {} 不包含範圍檢索,如檢索某時間段記錄,不包含頭尾
date:{200707 TO 200710}
14. \ 轉義操做符,特殊字符包括+ - && || ! ( ) { } [ ] ^ 」 ~ * ? : \
補:
庖丁分詞器
1. <fieldType name="text" class="solr.TextField">
2. <analyzer class="net.paoding.analysis.analyzer.PaodingAnalyzer"></analyzer>
3. </fieldType>
4. 注意:不能有 positionIncrementGap 屬性。
paoding-dic-home.properties文件的配置以下:
#values are "system-env" or "this";
#if value is "this" , using the paoding.dic.home as dicHome if configed!
#paoding.dic.home.config-fisrt=system-env
#dictionary home (directory)
#"classpath:xxx" means dictionary home is in classpath.
#e.g "classpath:dic" means dictionaries are in "classes/dic" directory or any other classpath directory
#paoding.dic.home=dic
#seconds for dic modification detection
#paoding.dic.detector.interval=60
paoding.dic.home=C://solr-tomcat//solr//dic
設置環境變量 paoding.dic.home
而後在schema.xml中配置FILED的類型是上面定義的Text。php