Solr查詢:DisMax查詢解析器

2018-11-23 14:55 更新

Solr 的 DisMax 查詢解析器設(shè)計用于處理由用戶輸入的簡單短語(沒有復(fù)雜的語法),并基于每個字段的重要性使用不同的權(quán)重(boosts)在多個字段中搜索各個術(shù)語。其他選項(xiàng)使用戶能夠根據(jù)每個用例的具體規(guī)則影響評分(獨(dú)立于用戶輸入)。

一般來說,DisMax 查詢解析器的接口更像 Google 的接口,而不是 “l(fā)ucene” Solr 查詢解析器的接口。這種相似性使得 DisMax 成為許多使用者應(yīng)用程序的合適查詢解析器。它接受簡單的語法,很少產(chǎn)生錯誤消息。

DisMax 查詢解析器支持 Lucene QueryParser 語法的一個極其簡化的子集。和 Lucene 一樣,引號可以用來對短語進(jìn)行分組,+/- 可以用來表示強(qiáng)制性和可選的子句。所有其他的 Lucene 查詢解析器特殊字符(AND 和 OR 除外)都被轉(zhuǎn)義以簡化用戶體驗(yàn)。DisMax 查詢解析器負(fù)責(zé)使用布爾子句構(gòu)建用戶輸入的良好查詢,該查詢包含跨域的 DisMax 查詢以及用戶指定的提升。它還可以讓 Solr 管理員提供額外的 boosting 查詢、boosting 函數(shù)和過濾查詢,以人為影響所有搜索的結(jié)果。這些選項(xiàng)都可以指定為 solrconfig.xml 文件中的請求處理程序的默認(rèn)參數(shù),或者在 Solr 查詢 URL 中被重寫。

對 DisMax 名稱背后的技術(shù)概念感興趣?其實(shí) DisMax 代表的是 Maximum Disjunction。以下是對 Maximum Disjunction 或 “DisMax” 查詢的定義:

一個查詢,它生成由其子查詢產(chǎn)生的文檔的聯(lián)合,該查詢將為每個文檔評分(由任何子查詢生成的該文檔的最高分?jǐn)?shù)),并為任何其他匹配的子查詢加一個并列中斷增量。

不管您是否記得這個解釋,記住 DisMax 查詢解析器的主要目的是易于使用,并且?guī)缀蹩梢越邮苋魏屋斎攵粫祷劐e誤。

DisMax 查詢解析器參數(shù)

除了常見的請求參數(shù)、突出顯示參數(shù)和簡單的 facet 參數(shù)外,DisMax 查詢解析器還支持下面描述的參數(shù)。與標(biāo)準(zhǔn)查詢解析器一樣,DisMax 查詢解析器允許在 solrconfig. xml 中指定默認(rèn)參數(shù)值,或者在請求中由查詢時間值重寫。

以下部分詳細(xì)解釋這些參數(shù)。

q 參數(shù)

該 q 參數(shù)定義了構(gòu)成搜索本質(zhì)的主要 “查詢”。該參數(shù)支持用戶提供的原始輸入字符串,沒有特殊的轉(zhuǎn)義。術(shù)語中的 + 和 - 字符被視為“強(qiáng)制性”和“禁止”修飾符。用平衡的引號字符(例如,“San Jose”)包裹的文本被視為一個短語。包含奇數(shù)個引號字符的任何查詢的計算方式就像根本沒有引號字符一樣。

該 q 參數(shù)不支持通配符,如 *。

q.alt 參數(shù)

如果指定,q.alt 參數(shù)定義一個查詢(默認(rèn)情況下將使用標(biāo)準(zhǔn)查詢解析語法進(jìn)行解析),當(dāng)主 q 參數(shù)未指定或?yàn)榭諘r。q.alt 當(dāng)您需要一個類似于查詢的東西來匹配所有的文檔時(不要忘記 &rows=0),q.alt 參數(shù)就派上用場了,可以獲得收集范圍的 faceting 計數(shù)。

qf(Query Fields)參數(shù)

qf 參數(shù)引入了一個字段列表,每個字段都分配了一個 boost 因子來增加或減少該字段在查詢中的重要性。例如,下面的查詢:

qf="fieldOne^2.3 fieldTwo fieldThree^0.4"

分配 fieldOne 一個 2.3 的提升, fieldTwo 為默認(rèn)提升(因?yàn)闆]有 boost 因素被指定),并且 fieldThree 提高 0.4。這些 boost 因素使 fieldOne 中的匹配比 fieldTwo 的匹配更加重要,它比 fieldThree 中的匹配更為重要。

mm(最小匹配)參數(shù)

在處理查詢時,Lucene / Solr 識別三種類型的子句:強(qiáng)制性的,禁止的和“optional”(也被稱為“should”子句)。默認(rèn)情況下,q 參數(shù)中指定的所有單詞或短語都被視為“optional”子句,除非它們前面有“+”或“ - ”。處理這些“optional”子句時,該 mm 參數(shù)可以說這些子句的某些最小值必須匹配。DisMax 查詢解析器在如何指定最小數(shù)字方面提供了很大的靈活性。

下表解釋了可以指定 mm 值的各種方法。

句法 示例 描述

正整數(shù)(Positive integer

3

定義必須匹配的最小子句數(shù),而不管總共有多少個子句。

負(fù)整數(shù)(Negative integer)

-2

將匹配子句的最小數(shù)量設(shè)置為可選子句的總數(shù)減去此值。

百分比(Percentage

75%

將匹配子句的最小數(shù)量設(shè)置為可選子句總數(shù)的百分比。從百分比計算出的數(shù)字向下取整,作為最小值。

負(fù)比例(Negative percentage

-25%

表示可選子句總數(shù)的百分比可能會丟失。從百分比計算出的數(shù)字向下舍入,然后從總數(shù)中減去以確定最小數(shù)量。

表達(dá)式以正整數(shù)開頭,后跟一個>或<符號和另一個值

3 <90%

定義一個條件表達(dá)式,指出如果可選子句的數(shù)目等于(或小于)整數(shù),則它們都是必需的,但如果它大于整數(shù),則應(yīng)用規(guī)范。在這個例子中:如果有1到3個子句,他們都是必需的,但是對于4個或更多子句,只需要90%。

涉及>或<符號的多個條件表達(dá)式

2 <-25%9 <-3

定義了多個條件,每個條件只對比它前面的一個更大的數(shù)字有效。在左邊的例子中,如果有1或2個子句,那么這兩個都是必需的。如果有3-9個子句,只有25%是必需的。如果有9個以上的話,除了3個外都是必需的。

指定 mm 值時,請記住以下幾點(diǎn):

  • 在處理百分比時,負(fù)值可用于在邊緣情況下獲得不同的行為。處理 4 個子句時,75% 和-25%意味著同樣的事情,但是當(dāng)處理5個子句時,75%意味著需要3個,但是-25%意味著需要4個。
  • 如果基于參數(shù)的參數(shù)的計算確定不需要可選子句,那么有關(guān)布爾查詢的常規(guī)規(guī)則仍然適用于搜索時間。(即,不包含必需子句的布爾查詢?nèi)匀槐仨氈辽倨ヅ湟粋€可選子句)。
  • 無論計算到達(dá)的數(shù)量是多少,Solr 都不會使用大于可選子句數(shù)量的值,或者小于1的值。換句話說,無論計算結(jié)果多么低或多高,所需的最小數(shù)量匹配永遠(yuǎn)不會少于1或大于子句的數(shù)量。
  • 在跨不同查詢分析器配置的多個字段進(jìn)行搜索時,各個字段之間的可選子句數(shù)量可能不同。在這種情況下,由 mm 指定的值適用于可選子句的最大數(shù)量。例如,如果查詢子句被視為其中一個字段的停用詞,那么該字段的可選子句數(shù)量將小于其他字段的數(shù)量。如果將 mm 設(shè)置為100%,則帶有這樣一個停用詞子句的查詢將不會返回該字段中的匹配項(xiàng),因?yàn)橐褎h除的子句不會被計算為匹配項(xiàng)。

mm 的默認(rèn)值為 100% (意味著所有子句都必須匹配)。

pf(Phrase Fields)參數(shù)

一旦使用 fq 和 qf 參數(shù)確定了匹配文檔的列表,就可以使用 pf 參數(shù)“boost”文檔的得分,因?yàn)?q 參數(shù)中的所有項(xiàng)都出現(xiàn)在非常接近的情況下。

該格式與 qf 參數(shù)所使用的格式相同:當(dāng)從整個 q 參數(shù)中進(jìn)行短語查詢時,字段列表和“boosts”將與每個字段相關(guān)聯(lián)。

ps(Phrase Slop)參數(shù)

ps 參數(shù)指定應(yīng)用于使用 pf 參數(shù)指定的查詢的 “短語 slop” 的數(shù)量。短語 slop 是一個標(biāo)記需要相對于另一個標(biāo)記移動以匹配查詢中指定的短語的位置的數(shù)量。

qs(Query Phrase Slop)參數(shù)

qs 參數(shù)指定用 qf 參數(shù)明確包含在用戶查詢字符串中的短語查詢所允許的傾斜量。如上所述,slop 是指為了匹配在查詢中指定的短語,一個標(biāo)記需要相對于另一個標(biāo)記移動的位置的數(shù)量。

tie(Tie Breaker)參數(shù)

tie 參數(shù)指定一個浮點(diǎn)值(應(yīng)該遠(yuǎn)遠(yuǎn)小于1),以便在 DisMax 查詢中用作 tiebreaker。

當(dāng)來自用戶輸入的術(shù)語針對多個字段進(jìn)行測試時,可能會有多個字段匹配。如果是這樣,每個字段將根據(jù)該字段在該字段中的普遍程度(對于每個文檔相對于所有其他文檔)產(chǎn)生不同的 score。通過該 tie 參數(shù),您可以控制查詢的最終 score 與最高 score 字段相比,將會受較低評分字段影響的程度。

值為“0.0”(默認(rèn)值)使查詢成為純粹的“分離最大查詢”:也就是說,只有最大 scoring 子查詢才有助于最終 score。值為“1.0”使查詢成為一個純粹的“分離總和查詢”,因?yàn)樽罱K score 將是子查詢 score 的總和,這與最大 scoring 子查詢無關(guān)。通常,一個較低的值(如0.1)是有用的。

bq(Boost Query)參數(shù)

bq 參數(shù)指定一個附加的可選查詢子句,將添加到用戶的主要查詢中以影響 score。例如,如果您想為最近的文檔添加相關(guān)性 boost:

q=cheese
bq=date:[NOW/DAY-1YEAR TO NOW/DAY]

您可以指定多個 bq 參數(shù)。如果您希望將查詢作為單獨(dú)的子句進(jìn)行分析,請使用多個 bq 參數(shù)。

bf(Boost Functions)參數(shù)

bf 參數(shù)指定將用于構(gòu)造 FunctionQueries 的函數(shù)(具有可選的 boosts),該函數(shù)將作為將影響 score 的可選子句添加到用戶的主查詢中??梢允褂糜?Solr 本地支持的任何函數(shù),以及 boost 值。例如: 

recip(rord(myfield),1,2,3)^1.5

使用 bf 參數(shù)指定函數(shù)本質(zhì)上只是使用 bqparam 與 {!func} 解析器結(jié)合的簡寫。

例如,如果要首先顯示最近的文檔,則可以使用以下任一項(xiàng):

bf=recip(rord(creationDate),1,1000,1000)
  ...or...
bq={!func}recip(rord(creationDate),1,1000,1000)

查詢提交給 DisMax Query Parser 的示例

本節(jié)中的所有示例 URL 均假設(shè)您正在運(yùn)行 Solr 的 “techproducts” 示例:

bin/solr -e techproducts

使用標(biāo)準(zhǔn)查詢解析器得到單詞 “video”的結(jié)果,我們假設(shè) “df” 指向要搜索的字段:

http://localhost:8983/solr/techproducts/select?q=video&fl=name+score

"dismax" 解析器被配置為跨 text、features、name、sku、id、manu 和 cat 字段進(jìn)行搜索,它們都具有不同的增強(qiáng)功能,旨在確保 "better" 的匹配首先出現(xiàn),具體來說: 在 name 和 cat 字段上匹配的文檔獲得更高的分?jǐn)?shù)。

http://localhost:8983/solr/techproducts/select?defType=dismax&q=video

請注意,此實(shí)例還配置了一個默認(rèn)的字段列表,可以在 URL 中重寫。

http://localhost:8983/solr/techproducts/select?defType=dismax&q=video&fl=*,score

您還可以覆蓋搜索的字段以及每個字段得到的 boost 程度。

http://localhost:8983/solr/techproducts/select?defType=dismax&q=video&qf=features^20.0+text^0.3

您可以提高具有與特定值匹配的字段的結(jié)果。

http://localhost:8983/solr/techproducts/select?defType=dismax&q=video&bq=cat:electronics^5.0

另一個請求處理程序在 “/ instock” 處注冊,并具有稍微不同的配置選項(xiàng),特別是:(inStock:true 的過濾器)。

http://localhost:8983/solr/techproducts/select?defType=dismax&q=video&fl=name,score,inStock
http://localhost:8983/solr/techproducts/instock?defType=dismax&q=video&fl=name,score,inStock

這個解析器中其他非??岬墓δ苤皇菑?qiáng)大的支持,根據(jù)用戶查詢中有多少術(shù)語來指定要使用的“BooleanQuery.minimumNumberShouldMatch”。這些允許錯別字和部分匹配的靈活性。對于 dismax 解析器,一個和兩個單詞查詢要求所有可選子句匹配,但對于三到五個字查詢,允許一個丟失的單詞。

http://localhost:8983/solr/techproducts/select?defType=dismax&q=belkin+ipod
http://localhost:8983/solr/techproducts/select?defType=dismax&q=belkin+ipod+gibberish
http://localhost:8983/solr/techproducts/select?defType=dismax&q=belkin+ipod+apple

使用 debugQuery 選項(xiàng)可以查看已解析的查詢以及每個文檔的分?jǐn)?shù)解釋。

http://localhost:8983/solr/techproducts/select?defType=dismax&q=belkin+ipod+gibberish&debugQuery=true
http://localhost:8983/solr/techproducts/select?defType=dismax&q=video+card&debugQuery=true
以上內(nèi)容是否對您有幫助:
在線筆記
App下載
App下載

掃描二維碼

下載編程獅App

公眾號
微信公眾號

編程獅公眾號