全文檢索引擎Solr系列——入門篇
原文出處: ImportNew
Solr采用Lucene搜索庫為核心,提供全文索引和搜索開源企業平臺,提供REST的HTTP/XML和JSON的API,如果你是Solr新手,那么就和我一起來入門吧!本教程以solr4.8作為測試環境,jdk版本需要1.7及以上版本。
準備
本文假設你對Java有初中級以上水平,因此不再介紹Java相關環境的配置。下載解壓縮solr,在example目錄有start.jar文件,啟動:
java -jar start.jar
瀏覽器訪問:http://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中來,繼續我們的學習。
刪除所有數據:
http://localhost:8983/solr/collection1/update?stream.body=<delete><query>*:*</query></delete>&commit=true
刪除指定數據
http://localhost:8983/solr/collection1/update?stream.body=<delete><query>title:abc</query></delete>&commit=true
多條件刪除
http://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字段的內容
http://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 #指定需要高亮的字段
http://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有了初步感性的認識,下一篇將介紹全文檢索的基本原理。