Solr Dismax查詢解析器-深刻分析

Solr 支持多種查詢解析,給搜索引擎開發人員提供靈活的查詢解析。Solr 中主要包含這幾個查詢解析器:標準查詢解析器、DisMax 查詢解析器,擴展 DisMax 查詢解析器(eDisMax)算法

Dismax

Dismax handler比standard handler多以下功能:函數

  1. 以不一樣的權值來搜索多個field。
  2. 限制查詢語法爲一個小的集合而且用無語法錯誤。該特性是強制的並是不可配置的
  3. 整個搜索查詢的自動的短語boosting
  4. 便利的查詢boosting參數,一般同函數查詢一塊使用
  5. 能指定單詞匹配的最少個數,這取決於查詢串中的單詞數.

Dismax query parser

這裏提到的全部應用於dismax的也都適用於edismax,除非明確說明不適用。其實edismax就是打算在將來的發佈版本中替代dismax的。搜索引擎

Lucene DisjunctionMaxQuery

dismax能夠查詢多個field,而且每一個field使用不一樣的boost。這個功能是由lucene的DisjunctionMaxQuery查詢類型來支持。如下的討論都是高級內容,不用刻意理解。只是記住dismax針對多個字段的查詢會設置tie參數爲0.1,這也是合理的選擇。spa

舉個例子。若是有一個簡單查詢rock。dismax可能會將它配置爲DisjunctionMaxQuery爲fieldA:rock2 fieldB:rock1.2 fieldC:rock0.5,若是是boolean查詢的話會跟這個查詢有些不一樣,不一樣的地方也就是得分。相似的boolean查詢的得分會基於這三個條文的總和,也就是DisjunctionMaxQuery會使用每個的最大值。針對多個字段查詢同一個term的狀況,而且有些字段相對於另外一些字段更重要,那麼dismax應該更好的處理得分。API文檔中的一個例子對這個特徵的解釋是,若是用戶查詢albino elephant,那麼假若有一種狀況是albino匹配一個字段,elephant匹配另外一個字段,另外一種狀況是albino匹配兩個字段,可是elephant沒有一個匹配,那麼dismax保證第一種狀況的得分高於第二種狀況。 另外一個dismax得分的難題就是tie參數,tie的取值是0-1,默認是0,在實踐中設置爲0.1效果最好。索引

Boosting:Automatic phrase boosting

dismax會把phrase查詢也就是引號引發來的查詢進行轉換,來改進得分。例如查詢billy joel 會轉換爲+(billy joel) "billy joel"也就是說,若是一個文檔包含billy joel,那麼它不只匹配原始term並且還匹配billy和joel,也就是匹配三個term,若是另外一個文檔不匹配短語billy joel,只是含有兩個單詞,那麼lucene的得分算法會給第一個文檔更高的得分。ip

Configuring automatic phrase boosting

automatic phrase boosting默認是不啓用的。要使用的話可使用pf參數,就是phrase fields的縮寫。語法與qf相同。用相同的值做爲開始並作相應的調整,從qf到pf變化一般的緣由有如下幾點:ci

  1. 使用不一樣的boost因素讓短語加強的影響沒有壓倒性。一些經驗能夠來引導你作這些調整。
  2. 忽略那些只有一個term的字段。好比惟一標識字段。
  3. 忽略那些含有太大的文本值的字段,由於它可能全使查詢效率大大下降。
  4. 使用一個具體相同值,可是使用不一樣analyzed的字段來替換這個字段

一樣的強烈推薦使用common-grams和shingling來提升執行效率。開發

Phrase slop configuration

phrase slop就是短語後跟一個波浪線和一個數字,就像這樣"billy joel"~1 對於全部明確指定的短語查詢dismax會自動添加兩個參數來設置slop:qs和phrase boosting:ps,若是slop沒有指定那麼就至關因而0。 10文檔

Partial phrase boosting

若是查詢的是兩個單詞,那麼edismax支持加強爲連續的單詞對,若是是三個單詞,那麼能夠加強三倍。例如查詢how now brown cow 會變爲: +(how now brown cow) "how now brown cow" "how now" "now brown" "brown cow" "how now brown" "now brown cow" 這個特徵不會被ps參數影響,ps只應用於entire phrase boost。it

Boosting:boost queries

dismax的bq參數能夠用來指定多個查詢,相似於automatic phrase boost。以相似的方式被添加到用戶的查詢中。記住一點,boosting只是用來影響q參數指定的用戶查詢所匹配到的那些文檔的scoring。若是匹配的結果還匹配bq查詢,那麼這個文檔的得分會更高。 (: -r_type:aaa)2加強全部文檔得分,可是除了aaa。 boost queries不如boost functions有用。

Boosting:boost functions

boost functions提供一個強大的功能就是使用用戶設置的公式來對文檔的score進行計算。這裏所說的公式也就是solr的function queries,使用bf參數來操做score。edismax支持boost參數來進行function query。可使用bf或boost屢次。

<str name="boost">recip(map(rord(r_event_date),0,0,99000),1,95000,95000)</str>

函數中不能有空格。bf和boost兩個參數其實並無以相同的方式解析。bf參數容許多種boost functions使用相同的參數,以空格分開,兩者選一的話仍是使用bf參數。還能夠在bf參數中乘以因子在函數的結尾。好比100

相關文章
相關標籤/搜索