擴展 DisMax (eDisMax) 查詢解析器

擴展 DisMax (eDisMax) 查詢解析器是 DisMax 查詢解析器的改良版本。

除了支援所有 DisMax 查詢解析器參數之外,擴展 DisMax

  • 還支援 標準查詢解析器語法,例如(非詳盡列表)

    • 布林運算子,例如 AND (+, &&)、OR (||)、NOT (-)。

    • 選擇性地將小寫的「and」和「or」視為 Lucene 語法模式中的「AND」和「OR」

    • 選擇性地允許使用其他查詢解析器或函數來嵌入查詢

  • 包含在語法錯誤情況下的改良智慧型部分跳脫;在此模式下仍支援欄位查詢、+/- 和詞組查詢。

  • 透過使用字詞 shingles 來改進鄰近提升;在套用鄰近提升之前,您不需要查詢來比對文件中的所有字詞。

  • 包含進階停用詞處理:停用詞在查詢的強制部分中不是必需的,但仍用於鄰近提升部分。如果查詢包含所有停用詞,例如「to be or not to be」,則所有字詞都是必需的。

  • 包含改良的提升函數:在擴展 DisMax 中,boost 函數是乘數 而不是加數,從而改善您的提升結果;也支援 DisMax 的加法提升函數 (bfbq)。

  • 支援純負向巢狀查詢:諸如 +foo (-foo) 之類的查詢將會比對所有文件。

  • 可讓您指定允許最終使用者查詢的欄位,並禁止直接欄位搜尋。

擴展 DisMax 參數

除了所有的 DisMax 參數之外,Extended DisMax 還包含以下查詢參數:

sow

是否以空白分隔。如果設定為 true,則會針對每個以空白分隔的詞彙單獨調用文字分析。預設值為 false;以空白分隔的詞彙序列將會一次性提供給文字分析,以啟用在詞彙序列上運作的分析篩選器的正常功能,例如多字同義詞和詞語搭配。

mm

最小匹配。有關 mm 的說明,請參閱 DisMax 的 mm 參數。eDisMax 的預設 mm 值與 DisMax 不同。

  • 預設的 mm 值為 0%

    • 如果查詢包含「AND」以外的明確運算符(「-」、「+」、「OR」、「NOT」);或

    • 如果 q.op 為「OR」或未指定。

  • 如果 q.op 為「AND」且查詢不包含任何「AND」以外的明確運算符,則預設的 mm 值為 100%。

mm.autoRelax

如果為 true,則當從某些但不是全部 qf 欄位中移除子句時(例如透過停用詞篩選器),所需子句的數量將會自動放寬。如果您遇到由於 qf 欄位之間停用詞移除不均勻而導致查詢返回零結果的情況,請使用此參數作為解決方案。

請注意,放寬 mm 可能會導致不良的副作用,例如降低搜尋的精確度,這取決於您的索引內容性質。

boost

一個多值字串列表,解析為 函式,其結果將乘以所有匹配文件的主查詢分數。此參數是使用 BoostQParserPlugin 包裝 eDisMax 產生的查詢的簡寫方式。

以下兩個範例是等效的:

q={!edismax qf=name}ipod
boost=div(1,sum(1,price))
q={!boost b=div(1,sum(1,price)) v=$qq}
qq={!edismax qf=name}ipod
lowercaseOperators

一個布林參數,表示小寫的「and」和「or」是否應視為與運算符「AND」和「OR」相同。預設值為 false

pf

片語欄位。使用 fqqf 參數識別出匹配的文件列表後,如果 q 參數中的所有詞彙都緊密相鄰出現,則可以使用 pf 參數來「提高」文件的分數。

其格式與 qf 參數使用的格式相同:欄位列表和「提高權重」,用於在根據整個 q 參數建立片語查詢時將其與每個欄位關聯。

ps

片語彈性。使用 pfpf2 和/或 pf3 欄位(影響權重提升)建立片語查詢時,詞彙之間的預設彈性量(距離)。另請參閱以下 使用「彈性」 章節。

pf2

一個具有可選權重的多值欄位列表。與 pf 類似,但基於單詞詞語搭配。

ps2

這與 ps 類似,但會覆蓋用於 pf2 的彈性因子。如果未指定,則使用 ps

pf3

一個具有可選權重的多值欄位列表,基於單詞搭配的三元組。與 pf 類似,除了不是根據輸入中的所有單詞為每個欄位建立片語,而是根據單詞三元組詞語搭配為每個欄位建立一組片語。

ps3

這與 ps 類似,但會覆蓋用於 pf3 的彈性因子。如果未指定,則使用 ps

stopwords

一個布林參數,表示在解析查詢時是否應遵守查詢分析器中配置的 StopFilterFactory。如果將此設定為 false,則會忽略查詢分析器中的 StopFilterFactory

uf

指定允許最終使用者明確查詢的架構欄位,以及切換是否支援嵌入式 Solr 查詢。此參數支援萬用字元。多個欄位必須以空格分隔。

預設值是允許所有欄位且不允許嵌入式 Solr 查詢,相當於 uf=* -_query_

  • 若只允許標題欄位,請使用 uf=title

  • 若允許標題和所有以 '_s' 結尾的欄位,請使用 uf=title *_s

  • 若允許除標題之外的所有欄位,請使用 uf=* -title

  • 若要不允許所有欄位搜尋,請使用 uf=-*

  • 若要允許嵌入式 Solr 查詢(例如,_query_:"…​"_val_:"…​"{!lucene …​}),您必須uf 中參照魔術欄位 _query_ 來明確啟用此功能。

使用每個欄位的 qf 覆寫進行欄位別名

可以指定 qf 參數的每個欄位覆寫,以提供從查詢字串中指定的欄位名稱到基礎查詢中使用的欄位名稱的一對多別名。預設情況下,不使用別名,並且查詢字串中指定的欄位名稱將被視為索引中的文字欄位名稱。

eDisMax 查詢範例

本節中的所有範例 URL 都假設您正在執行 Solr 的「techproducts」範例

bin/solr start -e techproducts

根據文件的受歡迎程度,提高查詢詞彙「hello」的結果

https://127.0.0.1:8983/solr/techproducts/select?defType=edismax&q=hello&pf=text&qf=text&boost=popularity

搜尋 iPods 或 video

https://127.0.0.1:8983/solr/techproducts/select?defType=edismax&q=ipod+OR+video

跨多個欄位搜尋,並指定(透過提高權重)每個欄位相對於彼此的重要性

https://127.0.0.1:8983/solr/techproducts/select?q=video&defType=edismax&qf=features^20.0+text^0.3

您可以提高具有符合特定值的欄位的結果

https://127.0.0.1:8983/solr/techproducts/select?q=video&defType=edismax&qf=features^20.0+text^0.3&bq=cat:electronics^5.0

使用 mm 參數時,1 個和 2 個單詞的查詢要求所有可選子句都匹配,但對於具有三個或更多子句的查詢,則允許缺少一個子句

https://127.0.0.1:8983/solr/techproducts/select?q=belkin+ipod&defType=edismax&mm=2
https://127.0.0.1:8983/solr/techproducts/select?q=belkin+ipod+gibberish&defType=edismax&mm=2
https://127.0.0.1:8983/solr/techproducts/select?q=belkin+ipod+apple&defType=edismax&mm=2

在以下範例中,我們看到 qf 參數的每個欄位覆寫用於將查詢字串中的「name」別名為「last_name」和「first_name」欄位

defType=edismax
q=sysadmin name:Mike
qf=title text last_name first_name
f.name.qf=last_name first_name

使用「彈性」

DismaxEdismax 可以針對所有查詢欄位執行查詢,並且還可以針對片語欄位以片語的形式執行查詢(這只會用於提高文件的權重,而不是實際用於匹配)。但是,該片語查詢可以具有「彈性」,這是在考慮片語匹配時查詢詞彙之間的距離。例如:

q=foo bar
qf=field1^5 field2^10
pf=field1^50 field2^20
defType=dismax

使用這些參數,DisMax 查詢解析器會產生類似以下的查詢:

 (+(field1:foo^5 OR field2:foo^10) AND (field1:bar^5 OR field2:bar^10))

但它也會產生另一個僅用於提高結果權重的查詢:

field1:"foo bar"^50 OR field2:"foo bar"^20

因此,任何具有詞彙「foo」和「bar」的文件都會匹配;但是,如果某些文件將兩個詞彙都作為片語,則它的分數會更高,因為它更相關。

如果您添加參數 ps(片語彈性),則第二個查詢將改為:

ps=10 field1:"foo bar"~10^50 OR field2:"foo bar"~10^20

這表示如果詞彙「foo」和「bar」出現在文件中,且彼此之間的距離小於 10 個詞彙,則該片語將會匹配。例如,以下文件:

*Foo* term1 term2 term3 *bar*

將會匹配片語查詢。

如何使用片語彈性?通常在請求處理程序(在 solrconfig 中)中進行配置。

使用查詢彈性(qs)時,概念類似,但它適用於用戶的明確片語查詢。例如,如果您想搜尋名稱,則可以輸入:

q="Hans Anderson"

包含「Hans Anderson」的文件將會匹配,但是包含中間名「Christian」或名稱以姓氏優先(「Anderson, Hans」)書寫的文件則不會。對於這些情況,可以配置查詢欄位 qs,以便即使使用者搜尋明確的片語查詢,也會套用彈性。

最後,除了片語欄位(pf)參數之外,edismax 也支援 pf2pf3 參數,用於建立雙字組和三字組片語查詢的欄位。這些參數查詢的片語彈性可以使用 ps2ps3 參數分別指定。如果您使用 pf2/pf3 但不使用 ps2/ps3,則這些參數查詢的片語彈性將取自 ps 參數(如果有的話)。

具有彈性的片語查詢中的同義詞擴展

當具有彈性的片語查詢(例如,具有 pspf)觸發同義詞擴展時,將會針對每個同義詞組合產生單獨的子句。例如,對於已配置的同義詞 dog,caninecat,feline,查詢 "dog chased cat" 將產生以下片語查詢子句:

  • "dog chased cat"

  • "canine chased cat"

  • "dog chased feline"

  • "canine chased feline"