Solr查詢配置及優化【eDisMax查詢解析器】
- 2020 年 3 月 2 日
- 筆記
一.簡介
Lucene查詢解析器語法支援創建任意複雜的布爾查詢,但還有一些缺點,它不是用戶查詢處理的理想解決方案。這裡面最大的問題是Lucene查詢解析器的語法要求嚴格,一旦破壞就會拋出異常。指望用戶在輸入關鍵詞時能夠理解Lucene查詢語法並始終能輸入完美的查詢表達式,這顯然是不合理的。這意味著,Lucene查詢解析器在許多搜索應用中對用戶不夠友好。
Lucene查詢解析器的另一個缺點是它不能默認搜索多個欄位。df參數定義了查詢解析器默認搜索哪個欄位,但是如果想要以不同權重對多個欄位進行搜索時,就必須先對查詢進行預處理。對大多數Solr開發人員來說,這樣的查詢預處理工作量過大。為了將用戶查詢直接傳入Solr並優雅地進行處理,擴展的析取最大化查詢解析器eDisMax應運而生。
二.eDisMax查詢解析器概述
eDisMax查詢解析器實際上是由Lucene查詢解析器和DisMax查詢解析器組成。DisMax查詢解析器是eDisMax查詢解析器的舊版本,只接受關鍵詞和少數幾個基本的布爾運算,允許在多個欄位中搜索關鍵詞。因為DisMax查詢解析器是eDisMax查詢解析器的一個子集,所有不建議使用原始的DisMax查詢解析器。
雖然eDisMax查詢解析器不是Solr的默認查詢解析器,但它具有查詢語法容錯性,不像Lucene查詢解析器那樣嚴格。
三.eDisMax查詢參數
eDisMax查詢解析器支援Lucene查詢解析器的所有查詢語法。它們之間只有一個明顯差異,eDisMax的輸入語法不會拋出異常,而是將無效的輸入作為文本字元串進行搜索。它還在語法解析上具有一定的容錯性,支援特殊關鍵詞。例如,可以理解小寫轉換後的AND和OR。這種靈活性和容錯性讓它比Lucene查詢解析器更適合處理用戶輸入。
四.搜索多個欄位
除了安全地處理用戶輸入文本和自由地解析查詢語法,eDisMax查詢解析器最有用的一個功能是對多個欄位進行搜索。eDisMax查詢解析器會將每個內容放在各自的欄位中。通過指定查詢和查詢欄位。例如:
q=solr in action&qf=title description author
另外,還可以根據意願在每個查詢基礎上調整權重。
q=solr in action&qf=title^1.5 description author^3
五.查詢與短語權重調整
eDisMax查詢解析器的一個重要功能是調整彼此鄰近的詞項的相關度。使用Lucene查詢解析器的典型查詢,不管詞項是否彼此鄰近,或是否視為一個短語,所有詞項的相關度都是一樣的。eDisMax查詢解析器的另一個功能是,對獨立於用戶主查詢的函數進行任意地相關度調整。
1.pf【短語欄位】、pf2和pf3參數
pf參數用於調整那些q參數中所有詞項彼此非常靠近的文檔得分。pf參數與qf參數使用相同的格式,獲取欄位列表及可選的相應權重。eDisMax查詢解析器嘗試對q參數中所有詞項進行短語查詢,如果能在任何短語欄位中找到確切的短語,則對匹配的文檔調整相應的權重。
除了pf參數,eDisMax查詢解析器還支援pf2和pf3參數。這些參數功能與pf參數類似,不過不需要q參數中所有詞項,它們將詞項分解為二元【pf2】或三元【pf3】,只對包含少量詞項的文檔調整權重。例如:在查詢Solr finds relevant documents中,pf3參數會對包含短語”solr finds relevant” 或 “finds relevant documents”的文檔調整權重。pf2與之類似,對包含其中任意兩個連續詞短語的文檔進行權重調整。
2.ps【短語間隔】、ps2和ps3參數
使用pf參數時,可能不希望查詢中的所有詞項作為一個精確的短語出現。使用ps參數可以指定查詢中的詞項間隔位置界限,以此在短語欄位上判斷匹配情況。eDisMax查詢解析器還支援ps2和ps3參數,允許為ps2和ps3修改短語間隔值。不明確指定時默認為ps參數。
3.qs【查詢短語間隔】參數
qs參數對用戶在主查詢q參數上明確指定短語的處理方式類似。將qs參數視為重新定義要匹配的確切內容,可以將間隔默認值為0修改為更高的數值。
4.tie【決勝局】參數
當查詢的詞項與文檔的多個欄位匹配時,tie參數可以決定如何處理這種情況。為匹配到的每個欄位的每個詞項計算其相關度得分,默認情況下,每個文檔中得分最高的欄位用於該詞項的相關度計算。這是析取的最大得分,也是該查詢解析器得名“析取最大值”的原因所在。這與Lucene查詢解析器形成鮮明對比,Lucene查詢解析器通常將每個欄位的每個詞項的相關度得分相加,計算出每個文檔的綜合相關度得分。
tie參數決定了最匹配的欄位之外的其他欄位的詞項相關度得分有多少應該貢獻給總體相關度得分。tie參數的默認值為0.0,這表示其它欄位不貢獻權重。當tie為1時,表示貢獻全部權重,此時相關等同於Lucene查詢解析器。在這種情況下,相關度評分使用的是析取和而不是析取最大值。
5.bq【提升查詢】參數
bq參數接受查詢字元串,其包含在主查詢q參數中,用來影響相關度得分。它不會影響匹配到的文檔數,隻影響文檔返回的順序。如果想為最近的文檔提升相關度,可以在請求中添加一下內容:
bq=date:[NOW/DAY-1YEAR TO NOW/DAY]
這將有效提升日期屬於去年的所有文檔的相關度得分。另外,還可以指定多個bq參數,在查詢解析時針對不同子句分別進行提升。
6.bf【提升函數】參數
bf參數能夠通過函數查詢來提升主查詢的相關度。例如,提升最新日期的文檔的相關度:
recip(rord(date),1,1000,1000)
bf參數接受Solr支援的所有函數及其權重值。
六.欄位別名
有時候需要在Solr中使用內部欄位名,這些欄位名並不適合顯示給用戶。對於動態欄位來說尤為如此,動態欄位名可能類似title_t_en這樣,但是我們希望在搜索中使用對用戶更友好的語法,例如,title:”some title”。eDisMax查詢解析器為此提供了欄位別名機制。
eDisMax查詢中的欄位別名通過在請求中添加參數f.{alias}.qf={realfield}來實現。例如:
/select?defType=edismax&q=title:”some title”&f.title.qf=title_t_en
查詢在title_t_en欄位上執行,接下來它會被查詢中出現的title欄位替換。欄位別名參數在默認的qf參數後使用,這意味著,可以將一個別名分別以不同的權重對應到多個內部欄位。在請求中添加任意數量的別名也是可以的。
多別名欄位的搜索類似於默認欄位的搜索,其中每個查詢詞項被分布在別名定義的查詢欄位上。唯一的區別是可以為每個別名定義單獨的qf欄位,而不是為默認欄位定義一個qf參數。因此,與每個別名相關的查詢部分會對欄位列表進行搜索。
七.可訪問欄位
在許多情況下,用戶只能對默認欄位以及可能的一小部分其它欄位進行關鍵詞搜索。由於有些內部欄位可能會包含某些敏感資訊【例如,用戶ID或其他內部標識符】,可能不希望用戶從Solr索引中猜出其他欄位並查詢它們。
雖然eDisMax查詢解析器允許主查詢q參數對任何欄位進行搜索,但也可以使用uf【用戶欄位】參數來加以限制。默認值是uf=*,允許用field:expression語法查詢所有欄位。如果要限制可用欄位為單個title欄位,指定uf=title即可。多欄位的訪問使用空格隔開:uf=title city date。如果要對用戶禁用所有欄位,則使用否定語法:uf=-*。如果要對指定欄位列表之外的其他欄位進行訪問,則使用uf=* -hiddenField1 -hiddenField2…
為確保完全控制用戶查詢,可以將uf參數和欄位別名參數結合使用。uf參數既接受真實欄位,也接受別名。這樣設置可以保護搜索引擎不訪問未經授權的欄位。
八.最小匹配
在布爾邏輯中使用二元運算符:AND和OR。它們是Lucene對必須匹配和應該匹配的內部表達形式。查詢表達式hello AND world可以改寫為+hello +world,這表示hello和world都必須匹配。OR用法於此類似,表示此中存在匹配的即可。
eDisMax查詢解析器通過mm【最小匹配】參數模糊了傳統布爾邏輯的界限。為了讓文檔實現匹配,mm參數在查詢中可以定義必須匹配的特定數量的詞項或詞項的百分比。這是對搜索應用的查准率與查全率進行操作的一個好方式。原因在於,它不要求所有詞項必須匹配【默認運算符為AND】或僅需要匹配其中一個詞項即可【默認運算符為OR】。
mm參數語法非常豐富,很難一下子掌握。例如:
mm可以定義必須匹配的表達式數量【正整數】、遺漏的表達式數量【負整數】、必須匹配的表達式百分比【正百分比】以及遺漏的表達式百分比【負百分比】。要進一步控制的話,根據查詢中現有的表達式數量,可以定義不同的最小匹配規則。以下面的查詢結構為例:
/select?q={!edismax mm=”2<50% 4<-45%” v=$example}&example=…
對於該查詢,以下規則將對不同的示例參數值生效:
eDisMax查詢解析器的最小匹配功能可以包含多個關鍵詞的查詢進行匹配品質和數量的細粒度控制。圖解從交集的角度解釋最小匹配閾值的作用:
解釋:5個詞項的最小匹配值設置為40%。在這種情況下,5個詞項至少需要匹配2個。與傳統的布爾邏輯AND/OR相比,最小匹配支援不同的交集。
mm參數變大通常會提高查准率,mm參數變小通常會提高查全率。
從本質上講,小於1的最小匹配值永遠不會被使用【因為至少需要一個】,大於子句數量的最小匹配值也不會被使用【因為最大值是查詢中的子句數量】。
九.eDisMax查詢解析器的優缺點
eDisMax查詢解析器除了支援Lucene查詢解析器的所有查詢語法外,還提供了許多附加功能。例如:多欄位搜索、清理用戶輸入、欄位別名和欄位限制,以及通過多查詢修正來改進短語相關度和其它權重因素。
使用eDisMax查詢解析器也有一些缺點。首先是與eDisMax查詢解析器進行多欄位搜索相關的處理問題。如果將所有詞項放入一個欄位並對其進行搜索,Lucene查詢解析器的查詢速度比使用eDisMax查詢解析器在相同的查詢表達式搜索多個欄位要快。當然,eDisMax查詢解析器也可以單欄位搜索。然而,eDisMax查詢解析器可以實現輕鬆多欄位搜索的同時,會為許多基於Solr的搜索應用帶來額外的執行花銷。