搜索
Solr搜索參數(shù)介紹
如圖琅绅,solr基本的查詢參數(shù)如上召川。
q搜索關(guān)鍵詞
q的值就是用戶提交到solr查詢的關(guān)鍵詞霞丧。 類似于在google想搜索solr扔嵌,那么你在google的輸入框中填寫的solr一樣掖桦。q參數(shù)只有一個(gè)作用本昏,高樹solr在計(jì)算返回結(jié)果時(shí)需要考慮那些關(guān)鍵詞。
fq過濾參數(shù)
fq全程是filter query枪汪。這里的過濾是基于字段進(jìn)行過濾的涌穆;利用fq參數(shù),可以限定solr返回的結(jié)果里面雀久,某些字段的值必須是什么宿稀,且fq可以設(shè)置多個(gè)值。比如你在淘寶里搜索男裝赖捌,那么淘寶是不會(huì)返回女裝數(shù)據(jù)給你的祝沸。這里顯然就是淘寶對(duì)商品的某些字段進(jìn)行了限制,使用fq你也可以實(shí)現(xiàn)這樣的效果巡蘸。
說明:關(guān)于這兩個(gè)參數(shù)的設(shè)置問題奋隶,Solr使用者傾向于將用戶輸入的關(guān)鍵詞放入q參數(shù)中,將機(jī)器生成的過濾參器放入fq參數(shù)中[Solr In Action悦荒,Trey Grainger]唯欣。如果同時(shí)設(shè)置了fq和q,那么solr會(huì)先查詢fq搬味,再匹配q境氢。
sort排序參數(shù)
這個(gè)很好理解了吧!solr可以對(duì)搜索結(jié)果根據(jù)某個(gè)字段進(jìn)行排序碰纬。支持升序和降序兩個(gè)操作萍聊,用的時(shí)候設(shè)置字段名 排序方式就可以了。如::price asc::(價(jià)格升序) 或::price desc::(價(jià)格降序)悦析。
start寿桨,rows分頁查詢參數(shù)
返回結(jié)果范圍:[start+rows]。
fl返回字段限制
提交該參數(shù)后强戴,solr返回的結(jié)果只包含fl限制的字段亭螟。
df默認(rèn)搜索字段
df全稱default field,solr在進(jìn)行匹配結(jié)果時(shí)骑歹,q參數(shù)的值默認(rèn)和哪一個(gè)字段進(jìn)行匹配预烙。
好了,來一個(gè)實(shí)例看一下效果:
到這里相信你對(duì)solr搜索有了一個(gè)基本的了解了道媚。
但是由于我們?cè)趯?duì)solr進(jìn)行數(shù)據(jù)索引時(shí)扁掸,使用的是solr默認(rèn)的分詞器翘县,這個(gè)分詞器對(duì)拉丁語系的支持比較好。像中文這種方塊字谴分,solr就比較無力了锈麸。但是solr7以后的版本,都增加了對(duì)中文分詞的支持狸剃,況且還有第三方的解決方案掐隐。接下來我們就來了解一下如何配置中文分詞器狗热,以提升對(duì)中文的搜索效果钞馁。
中文分詞
分詞是什么意思?為什么要進(jìn)行分詞呢匿刮?
對(duì)于solr這種全文本搜索類型的引擎來說僧凰,解決的就是對(duì)文檔內(nèi)容進(jìn)行搜索和匹配。怎么個(gè)匹配法熟丸?相信對(duì)于搜索引擎有所了解的同學(xué)都知道詞元分析和詞元匹配的說法训措,不過不了解也沒關(guān)系,因?yàn)槲乙膊欢?/p>
由于搜索引擎的原理太過于復(fù)雜光羞,這里只能舉個(gè)例子簡(jiǎn)單的說明一下绩鸣。
一個(gè)文檔數(shù)據(jù)庫里某一個(gè)文檔的內(nèi)容如下:
巴菲特說:金錢只是一堆數(shù)字。
對(duì)于這句話纱兑,solr需要把這句話拆分成不同的單詞組成的詞元流呀闻。比如大概和下面差不多的效果:
巴菲特 金錢 數(shù)字 說 一堆
使用solr默認(rèn)的分詞器肯定不能實(shí)現(xiàn)這樣的效果,因?yàn)槔≌Z系和漢字的構(gòu)詞方式全然不同潜慎,因此我們需要為solr配置一個(gè)支持中文分詞的分詞器捡多,來完成上面的工作。
使用內(nèi)置中文分詞器
在solr-7.4.0/contrib/analysis-extras/lucene-libs/
目錄下有一個(gè)lucene-analyzers-smartcn-7.4.0.jar
的文件铐炫,將這個(gè)文件以你最優(yōu)雅的方式拷貝到solr-7.4.0/server/solr-webapp/WEB-INF/lib
目錄下垒手,然后重啟使用./solr retart -force
重啟solr。
重啟完成后打開solr-7.4.0/server/solr/<your-core-name>/conf/managed-schema
文件倒信,并在文件的fieleType區(qū)域添加如下內(nèi)容:
<fieldType name="text_smartcn" 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>
添加之后在solr管理頁面下的 core admin面板中重新加載核心科贬。
我們來驗(yàn)證一下我們添加的中文分詞器效果如何,打開核心的管理面板:
然后我們可以使用solr提供的分析功能鳖悠,來幫助我們檢驗(yàn)自己定義的分詞器的使用效果榜掌。
如圖,我們預(yù)期的結(jié)果是:
巴菲特 金錢 數(shù)字 說 一堆
Solr自帶的分詞器得到的結(jié)果是:
巴 菲 特 說 竞穷, 金錢 只是 一 堆 數(shù)字 唐责,
效果很不錯(cuò)了,有木有~~~
使用第三方分詞器
第三方的中文分詞器大部分都是用IKAnalyzer實(shí)現(xiàn)的瘾带,據(jù)說效果比solr自帶的分詞器好鼠哥。
- 下載IKAnalyzer所需的依賴包
ik-analyzer-7.4.jar - 將ik-analyzer-7.4.0.jar文件復(fù)制到
solr-7.4.0/server/solr-webapp/WEB-INF/lib
目錄下 - 打開
solr-7.4.0/server/solr/<your-core-name>/conf/managed-schema
文件熟菲,并在文件的fieleType區(qū)域添加如下內(nèi)容:
<fieldType name="text_ik" class="solr.TextField">
<analyzer type="index">
<tokenizer class="org.wltea.analyzer.lucene.IKTokenizerFactory" useSmart="false" conf="ik.conf"/>
<filter class="solr.LowerCaseFilterFactory"/>
</analyzer>
<analyzer type="query">
<tokenizer class="org.wltea.analyzer.lucene.IKTokenizerFactory" useSmart="true" conf="ik.conf"/>
<filter class="solr.LowerCaseFilterFactory"/>
</analyzer>
</fieldType>
- 重啟solr后reload核心即可
對(duì)比一下分詞結(jié)果:
巴菲特 菲特 說 金錢 一堆 堆 數(shù)字
對(duì)比solr自帶分詞器的結(jié)果,可以看出ik分詞器能夠更準(zhǔn)確的識(shí)別中文詞語朴恳;再看一個(gè)例子:
默認(rèn)搜索字段配置
在solrconfig文件中抄罕,支持對(duì)搜索中df值的配置。具體配置如下:
在solrconfig.xml文件中的requestHandler節(jié)點(diǎn)中于颖,可以看到默認(rèn)的搜索處理器/select
配置呆贿,如果有需要更改df和wt默認(rèn)值的需求,開啟配置中注釋的部分進(jìn)行配置即可森渐。