Solr採用Lucene搜索庫為核心,提供全文索引和搜索開源企業平臺,提供REST的HTTP/XML和JSON的API,如果你是Solr新手,那麼就和我一起來入門吧!Lucene的搜索原理(亦是Solr的搜索原理)不清楚的可以看下我之前關於Lucene的文章(文末有鏈接)。
Solr是什麼?
Solr是一個獨立的企業級搜索應用服務器,它對外提供類似於Web-service的API接口。用戶可以通過http請求,向搜索引擎服務器提交一定格式的XML文件,生成索引;也可以通過Http Get操作提出查找請求,並得到XML格式的返回結果。
同類產品:基於Lucene框架的搜索引擎有很多,如 Solr,Elastic Search,Nutch等
對中文的支持 : 對於中文用戶來說,最關心的問題是其是否支持中文的全文檢索。但通過後面對於Lucene的結構的介紹,你會了解到由於Lucene良好架構設計,對中文的支持只需對其語言詞法分析接口進行擴展就能實現對中文檢索的支持。
一、下載安裝:
本文假設你對Java有初中級以上水平,因此不再介紹Java相關環境的配置(jdk1.7及以上版本)。直接官網下載解壓縮solr,目錄如下:
在example目錄有start.jar文件,啟動:java -jar start.jar。
瀏覽器訪問://localhost:8983/solr/,你看到的就是solr的管理界面
二、索引數據:
服務啟動後,目前你看到的界面沒有任何數據,你可以通過POSTing命令向Solr中添加(更新)文檔,刪除文檔,在exampledocs目錄包含一些示例文件,運行命令:
java -jar post.jar solr.xml monitor.xml
上面的命令是向solr添加了兩份文檔,打開這兩個文件看看裡面是什麼內容,solr.xml裡面的內容是:
<add>
<doc>
<field name="id">SOLR1000</field>
<field name="name">Solr, the Enterprise Search Server</field>
<field name="manu">Apache Software Foundation</field>
<field name="cat">software</field>
<field name="cat">search</field>
<field name="features">Advanced Full-Text Search Capabilities using Lucene</field>
<field name="features">Optimized for High Volume Web Traffic</field>
<field name="features">Standards Based Open Interfaces - XML and HTTP</field>
<field name="features">Comprehensive HTML Administration Interfaces</field>
<field name="features">Scalability - Efficient Replication to other Solr Search Servers</field>
<field name="features">Flexible and Adaptable with XML configuration and Schema</field>
<field name="features">Good unicode support: héllo (hello with an accent over the e)</field>
<field name="price">0</field>
<field name="popularity">10</field>
<field name="inStock">true</field>
<field name="incubationdate_dt">2006-01-17T00:00:00.000Z</field>
</doc>
</add>
表示向索引中添加一個文檔,文檔就是用來搜索的數據源,現在就可以通過管理界面搜索關鍵字”solr”,具體步驟是:
點擊頁面下的Execute Query按鈕後右側就會顯示查詢結果,這個結果就是剛才導入進去的solr.xml的json格式的展示結果。solr支持豐富的查詢語法,比如:現在想搜索字段name裡面的關鍵字”Search”就可以用語法name:search,當然如果你搜索name:xxx就沒有返回結果了,因為文檔中沒有這樣的內容。
三、數據導入:
導入數據到Solr的方式也是多種多樣的:
可以使用DIH(DataImportHandler)從數據庫導入數據
支持CSV文件導入,因此Excel數據也能輕鬆導入
支持JSON格式文檔
二進制文檔比如:Word、PDF
還能以編程的方式來自定義導入
四、更新數據:
如果同一份文檔solr.xml重複導入會出現什麼情況呢?實際上solr會根據文檔的字段id來唯一標識文檔,如果導入的文檔的id已經存在solr中,那麼這份文檔就被最新導入的同id的文檔自動替換。你可以自己嘗試試驗一下,觀察替換前後管理界面的幾個參數:Num Docs,Max Doc,Deleted Docs的變化。
numDocs:當前系統中的文檔數量,它有可能大於xml文件個數,因為一個xml文件可能有多個<doc>標籤。
maxDoc:maxDoc有可能比numDocs的值要大,比如重複post同一份文件後,maxDoc值就增大了。
deletedDocs:重複post的文件會替換掉老的文檔,同時deltedDocs的值也會加1,不過這只是邏輯上的刪除,並沒有真正從索引中移除掉
五、刪除數據:
通過id刪除指定的文檔,或者通過一個查詢來刪除匹配的文檔
java -Ddata=args -jar post.jar "<delete><id>SOLR1000</id></delete>"
java -Ddata=args -jar post.jar "<delete><query>name:DDR</query></delete>"
此時solr.xml文檔從索引中刪除了,再次搜”solr”時不再返回結果。當然solr也有數據庫中的事務,執行刪除命令的時候事務自動提交了,文檔就會立即從索引中刪除。你也可以把commit設置為false,手動提交事務。
java -Ddata=args -Dcommit=false -jar post.jar "<delete><id>3007WFP</id></delete>"
執行完上面的命令時文檔並沒有真正刪除,還是可以繼續搜索相關結果,最後可以通過命令:
java -jar post.jar -
提交事務,文檔就徹底刪除了。現在把剛剛刪除的文件重新導入Solr中來,繼續我們的學習。
刪除所有數據:
//localhost:8983/solr/collection1/update?stream.body=<delete><query>*:*</query></delete>&commit=true
刪除指定數據
//localhost:8983/solr/collection1/update?stream.body=<delete><query>title:abc</query></delete>&commit=true
多條件刪除
//localhost:8983/solr/collection1/update?stream.body=<delete><query>title:abc AND name:zhang</query></delete>&commit=true
六、查詢數據:
查詢數據都是通過HTTP的GET請求獲取的,搜索關鍵字用參數q指定,另外還可以指定很多可選的參數來控制信息的返回,例如:用fl指定返回的字段,比如f1=name,那麼返回的數據就只包括name字段的內容
//localhost:8983/solr/collection1/select?q=solr&fl=name&wt=json&indent=true
七、排序:
Solr提供排序的功能,通過參數sort來指定,它支持正序、倒序,或者多個字段排序
q=video&sort=price desc
q=video&sort=price asc
q=video&sort=inStock asc, price desc
默認條件下,Solr根據socre 倒序排列,socre是一條搜索記錄根據相關度計算出來的一個分數。
八、高亮:
網頁搜索中,為了突出搜索結果,可能會對匹配的關鍵字高亮出來,Solr提供了很好的支持,只要指定參數:
hl=true #開啟高亮功能
hl.fl=name #指定需要高亮的字段
//localhost:8983/solr/collection1/select?q=Search&wt=json&indent=true&hl=true&hl.fl=features
返回的內容中包含:
"highlighting":{
"SOLR1000":{
"features":["Advanced Full-Text <em>Search</em> Capabilities using Lucene"]
}
}
九、文本分析:
文本字段通過把文本分割成單詞以及運用各種轉換方法(如:小寫轉換、複數移除、詞幹提取)後被索引,schema.xml文件中定義了字段在索引中,這些字段將作用於其中.
默認情況下搜索”power-shot”是不能匹配”powershot”的,通過修改schema.xml文件(solr/example/solr/collection1/conf目錄),把features和text字段替換成”text_en_splitting”類型,就能索引到了。
<field name="features" type="text_en_splitting" indexed="true" stored="true" multiValued="true"/>
...
<field name="text" type="text_en_splitting" indexed="true" stored="false" multiValued="true"/>
修改完後重啟solr,然後重新導入文檔
java -jar post.jar *.xml
現在就可以匹配了
power-shot—>Powershot
features:recharing—>Rechargeable
1 gigabyte –> 1G
今天,Solr的使用指北就到這裡。對於其搜索原理,可收藏本文後查看:這麼說吧,Lucene很簡單,其實就是個框架,用於全文檢索用的。本頭條號內有多個專題,如【數據結構】、【netty專題】、【dubbo專題】、【mysql優化專題】、【redis專題】、【高併發專題】等優質好文,適合3-5年(12-18k)經驗的程序員閱讀,頭條大屌們可關注後靜下心來查看專題文章。