solr採用Lucene搜索庫爲核心,提供全文索引和搜索開源企業平臺,提供REST的HTTP/XML和Json的API,以下是我的測試環境:
1.solr版本4.5.0
2.jdk是1.6
準備
java相關壞境配置,相信大家熟知,然後下載並解壓solr,最後在解壓後的目錄下solr-4.5.0 ->example 找到start.jar
運行cmd運行:
java -jar start.jar
表示已經成功啓動solr服務
接着瀏覽器中訪問:http://localhost:8983/solr/ 後就能開到solr的管理界面。
索引數據
服務啓動之後,目前你看到的界面沒有任何數據,你可以通過POSTing命令向Solr中添加(更新)文檔,刪除文檔,在exampledocs目錄包含一些
實例文件,運行命令:
java -jar post.jar solr.xm monitor.xml 或者 添加所有xml文件:java -jar post.jar *.xml
或
上兩圖分別表示向Solr添加了兩份xml文檔和目錄底下所有的xml文件,先看看solr.xml裏面的文件內容:
添加的文檔就是數據源,現在就可以通過管理界面來搜索關鍵詞“solr”:
然後點擊下面的 Execute Query按鈕後右側會出現查詢結果,這個結果就是剛剛添加到solr.xml文檔Json格式的展示結果。Solr支持豐富的查詢語法,
如:現在想搜索字段name的值爲:Search,就可以用name:search,當然你在本測試環境中搜索是沒有結果的,因爲文檔就沒有這樣的內容。
數據導入
Solr導入數據的方式的多種多樣的:
1.可以使用DIH(DataImportHandler)從數據庫導入數據
2.支持CSV文件導入,因此Excel也可以導入
3.支持Json格式文檔
4.二進制文檔,如:Word、PDF
5.以編程的方式來自定義導入
更新數據
如果是同一份分檔solr.xml重複導入會出現什麼情況呢? 實際上solr會根據文檔的字段Id來唯一標示文檔,如果導入的文檔的Id已經存在在Solr中,
那麼這份文檔就被最新導入的同Id的文檔自動替換,檢測的方法是管理界面的幾個參數:Num Docs,Max Doc,Deleted Docs的變化。
Num Docs:當前系統中的文檔數量,它有可能大於xml文件數,因爲一個xml文件可能會有多個<doc>標籤
Max Doc:有可能比Num Docs的值大,比如重複post同一份文件後,maxDoc的值就增大了
Deleted Docs:重複post文件會替換老的文檔,同時deletedDocs的值會加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也有數據庫中的事務,執行刪除命令的時候,會自動提交。
文檔就會立即從索引中刪除,你也可以將commit設置爲false,手動提交事務:
java -Ddata=args -Dcommit=false -jar post.jar "<delete><id>SOLR1000</id></delete>"
執行上面的命令後,並沒有真正刪除,還是可以搜索到結果,還要通過以下命令:
java -jar post.jar -
提交事務,文檔就徹底刪除了。現在我們又重新導入數據文檔,繼續:
刪除所有數據:
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,另外還可以指定很多可選的參數來控制信息的返回,例如:
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"
/>