前言
本來以為網上已經有了類似博文,不想重復,可是一圈搜下來,都是一些內容不甚明了的文章,或者solr版本太過老,參考價值不高,更有甚者,直接拷貝的別人的內容。一篇博客,各大平台都能看到,也不見轉載鏈接。有人說百度搜索不到內容,用谷歌,把責任推到百度身上,但這是百度的原因嗎?在國內網絡的資源整體質量不高低,並且內容太多重復的情況下,百度能夠提供什么高質量的內容給你。
也有我搜索資源的時候,會看到IBM開者中心的翻譯文檔,在文章的最后,都會附上參考文章,但是在國內,顯有這種情況。那些拷貝別人博文的人,有沒有想過,寫一篇博文的不易?同樣,博文作者是否也想過這個問題?話不多說,進入正題。
聲明:因為本人不是從事java開發,而且技術不高,英語也很差,如果文章中存在錯誤的解說,望諒。
參考文章:
window環境
1,安裝solr
下載solr,選擇相應版本,注意:因為solr對是基於java的,所以必需安裝jre。每個版本的 solr對jre版本要求不一樣,下載時請注意solr的版本。
編寫這篇博文時,solr的最新版本是6.6,文章也是基於6.6版本寫的,其要求1.8版本或以上的jre。jre的安裝,這些就不列出了,因為太過簡單。
Window用戶請下載zip包
將壓縮包解壓到相應目錄
使用命令行工具,進入解壓后的solr目錄的bin目錄
啟動solr
運行命令: bin\solr.cmd start
注意:solr有兩種模式:core,collection,如果要使用collection,請加-c或者-cloud,啟用solrClund。兩者之間的區別,我不敢妄下定論。從搜索的資料綜合分析,一個是單機,一個是集群,此處僅供參考,可能存在錯誤。
solr默認監聽的是8983端口
更多命令用法,請使用solr -help,如果solr已經啟動,請使用solr start -help。
如果啟動成功,可以在瀏覽器中打開:http://localhost:8983/solr/,使用其web管理客戶端。
2,查看solr范例
先停止solr實例
bin\solr.cmd stop
再啟用solr范例
bin\solr.cmd -e techproducts
打開web管理客戶端:http://localhost:8983/solr/,查看結果
根據結果,可知道,techproducts范例中共有32篇文章。
現在可以嘗試他的查詢功能。
我在q輸入框中輸入了Samsung,其得到的結果如下圖
3,添加文檔
添加好后,進入查詢界面,看能否查到這篇文檔
4,刪除文檔
返回查詢界面,查詢刪除后的結果
solr是通過Request-Handler指令操作文檔的,solr項目所有的Request-Handler指令都定義在項目目錄的conf文件夾下的solrconfig.xml文件里requestHandler標簽中。
關於文檔操作更詳細的說明請參考:
Indexing and Basic Data Operations
Uploading Data with Index Handlers
5,創建solr項目
現在學會一些基本的操作,可以自己創建一個項目錄了。
先把停止solr
solr.cmd stop -all
solr是一個實例可以有多個core或collection,如果不先停止,創建的core將會添加到啟用的techproducts實例中
solr.cmd create -c test
重新刷新web客戶端
6,下載php的solr擴展
現在開始使用php和solr交互了,所以必需安裝solr擴展,下載地址
下載解壓之后,將其中的dll文件放到php的擴展目錄,對於php擴展所在目錄,然后在php.ini開啟solr擴展,再通phpinfo查看是否正常安裝。
我默認所有讀者都知道php擴展配置方式,所有這里不詳細描述。
注意:php有Thread Safe和NoneThread Safe之分,下載之前,請先確定你安裝的php是哪種類型。
7,使用php腳本添加文檔
$options = array ( 'hostname' => "localhost", 'path' => 'solr/test', 'port' => '8983', ); $client = new SolrClient($options); $data = array( array( 'id' => 'EN80922032', 'name' => '男士打磨直筒休閑牛仔褲', 'brand' => 'ENERGIE', 'cat' => '牛仔褲', 'price' => '1870.00' ), array( 'id' => 'EN70906025', 'name' => '品牌LOGO翻領拉鏈外套', 'brand' => 'ENERGIE', 'cat' => '外套', 'price' => '1680.00' ), ); foreach($data as $key => $value) { $doc = new SolrInputDocument(); foreach($value as $key2 =>$value2) { $doc->addField($key2,$value2); } $client->addDocument($doc); } $client->commit();
在solr的web客戶端查詢的結果
更多實例請見:php的solr擴展官方文檔
注意:參考官方文檔時,注意其連接參數,依其博文必需有path參數,path參數是"solr/",加上你用solr創建的core名稱。
9,使用php腳本查詢文檔
$options = array ( 'hostname' => "localhost", 'path' => 'solr/test', 'port' => '8983', ); $client = new SolrClient($options); $query = new SolrQuery(); $query->setQuery('打磨'); $query->setStart(0); $query->setRows(50); $query->addField('name'); $query_response = $client->query($query); $response = $query_response->getResponse(); print_r($response);
輸入的結果
SolrObject Object ( [responseHeader] => SolrObject Object ( [status] => 0 [QTime] => 3 [params] => SolrObject Object ( [q] => 打磨 [indent] => on [fl] => name [start] => 0 [rows] => 50 [version] => 2.2 [wt] => xml ) ) [response] => SolrObject Object ( [numFound] => 1 [start] => 0 [docs] => Array ( [0] => SolrObject Object ( [name] => Array ( [0] => 男士打磨直筒休閑牛仔褲 ) ) ) ) )
10,使用php腳本刪除文檔
$client->deleteByQuery('id:EN80922032'); $result = $client->commit(); print_r($result);
輸出的結果不易看懂
可以使用第九條“使用php腳本查詢文檔”,查看刪除后的結果,也可以用web客戶端查看結果。
11,更新文檔
更新文檔和添加文檔一樣,只要在數據中指定要更新的id即可。
12,添加搜索建議
在添加的core的conf文件里sorlconfig.xml中新增一搜索建議組件。依本博文,目錄地址為:solr-6.6.0\server\solr\test\conf\solrconfig.xml
配置只在solr6.6上經過測試,不能保證可在其他solr版本中使用
<searchComponent name="suggest" class="solr.SuggestComponent"> <str name="queryAnalyzerFieldType">string</str> <lst name="suggester"> <str name="name">suggest</str> <str name="lookupImpl">org.apache.solr.spelling.suggest.tst.TSTLookupFactory</str> <str name="field">title</str> <str name="buildOnOptimize">true</str> <str name="buildOnCommit">true</str> </lst> </searchComponent> <requestHandler name="/suggest" class="solr.SearchHandler" startup="lazy" > <lst name="defaults"> <str name="suggest">true</str> <str name="suggest.dictionary">suggest</str> <str name="suggest.count">10</str> </lst> <arr name="components"> <str>suggest</str> </arr> </requestHandler>
23,添加中文分詞
solr自帶了中文分詞功能,依本博文,目錄地址為:solr-6.6.0\contrib\analysis-extras\lucene-libs\lucene-analyzers-smartcn-6.6.0 .jar。
首先查看sorlconfig.xml配置文件是否已經配置了這個分配庫的地址
<lib dir="${solr.install.dir:../../../..}/contrib/extraction/lib" regex=".*\.jar" />
如果沒有,請配置分詞庫的地址。
在managed-schema文件中新增一個字段類型
<fieldType name="text_cn" class="solr.TextField" positionIncrementGap="100"> <analyzer type="index"> <tokenizer class="org.apache.lucene.analysis.cn.smart.HMMChineseTokenizerFactory"/> </analyzer> <analyzer type="query"> <tokenizer class="org.apache.lucene.analysis.cn.smart.HMMChineseTokenizerFactory"/> </analyzer> </fieldType>
然后將相應字段的類型設置成text_cn,例如,本博文中將name設為text_cn類型
<field name="title" type="text_cn" indexed="true" stored="true" required="true" multiValued="true"/>
在后台選擇相應的core,點擊【analysis】菜單,在字段值中輸入相應中文,在Fieldname/FieldType中選擇相應設置了字段類型為text_cn的字段,或者直接選擇text_cn字段類型,點擊【analysis】查看分詞效果
為什么要設置中文分詞呢?
在說原因之前,我們先查看使用其他字段類型分析結果。
solr因為不支持中文,將會對內容時行最小分割,一個詞一個索引,如果不使用中文分詞,將產生大量的索引,以滿足中文的搜索需求。(此為個人觀點,未佐證,請務盲目相信)。
另外,如果不使用中文分詞,那搜索建議只能返回單個中文字。新增一條文檔記錄,測試搜索建議的結果是否真是如此。
注意:測試這個功能時,請將含有中文的字段改為未設置中文分詞的字段類型,更改后重啟solr,並重新添加一條文檔,文檔中的中文詞匯必需是 solr現有文檔中不存在的詞匯。
新增文檔
以下是瀏覽器搜索結果
測試成功,我們將此文檔刪除,並重新添加這個文檔,將字段類型更為中文分詞類型,即本博文中新增的 text_cn 。
注意:刪除文檔之后,最好查詢一下,solr中是還存在此文檔,以防重復文檔未被刪除.
再次搜索
結語:水平有限,只能寫這么多。如果有時間,我將持續更新此博文。