Solr擴(kuò)展的DisMax查詢解析器:eDismax

2018-11-24 15:50 更新

Solr 擴(kuò)展的 DisMax(eDisMax)查詢解析器是 DisMax 查詢解析器的改進(jìn)版本。

除了支持所有的 DisMax 查詢解析器參數(shù)外,eDismax 解析器還有如下擴(kuò)展:

  • 支持完整的 Lucene 查詢分析器語(yǔ)法,它與 Solr 的標(biāo)準(zhǔn)查詢解析器具有相同的增強(qiáng)功能。
    • 支持 AND、OR、NOT、 - 和+等查詢。
    • 在 Lucene 語(yǔ)法模式下可選地將 “and” 和 “or” 視為 “AND” 和 “OR”。
    • 尊重 'magic 字段' 的名字:_val_ 和 _query_。這些在 Schema 中不是真實(shí)的字段,但是如果使用它,它可以幫助做特殊的事情(如 _val_ 的情況下的函數(shù)查詢, 或者在 _query_ 中的嵌套查詢)。如果 _val_ 用于術(shù)語(yǔ)或短語(yǔ)查詢,則該值將作為函數(shù)進(jìn)行分析。
  • 在語(yǔ)法錯(cuò)誤的情況下包括改進(jìn)的智能部分轉(zhuǎn)義; 在此模式下仍然支持字段查詢、+/- 和短語(yǔ)查詢。
  • 通過使用單詞 shingles 來提高接近度增強(qiáng);在應(yīng)用近似增強(qiáng)之前,不需要查詢來匹配文檔中的所有單詞。
  • 包括高級(jí)的停用詞處理:在查詢的強(qiáng)制部分中不需要停用詞,但仍用于近似增強(qiáng)部分。如果一個(gè)查詢由所有的停用詞組成,例如“to be or not to be”,那么所有的單詞都是必需的。
  • 包括改進(jìn)的 boost 功能:在 eDisMax 中,該 boost 功能是一個(gè)乘數(shù)而不是加數(shù),提高了您的 boost 效果;DisMax的附加 boost 功能(bf 和 bq)也被支持。
  • 支持純粹的消極嵌套查詢:諸如 +foo (-foo) 的查詢將匹配所有文檔。
  • 讓您指定允許最終用戶查詢哪些字段,并禁止直接派遣的搜索。

eDisMax 參數(shù)

除了包含所有的 DisMax 參數(shù)外,擴(kuò)展的 DisMax(eDismax)解析器還包括下述的查詢參數(shù):

sow

拆分空格。如果設(shè)置為true,則對(duì)每個(gè)單獨(dú)的空格分隔的術(shù)語(yǔ)分別調(diào)用文本分析。默認(rèn)是false;空格分隔的術(shù)語(yǔ)序列將一次性提供給文本分析,從而使分析篩選器的功能能夠正常運(yùn)行,例如,多字同義詞和 shingles。

mm.autoRelax

如果為 true,從一些(而不是所有)qf 字段中刪除子句(例如通過停用詞過濾器),則所需的子句數(shù)(最小值應(yīng)匹配)將自動(dòng)放寬。如果您遇到由于qf字段之間不均勻禁止刪除而導(dǎo)致查詢返回零擊中,請(qǐng)使用此參數(shù)作為解決方法。

請(qǐng)注意,放松mm可能會(huì)導(dǎo)致不必要的副作用,例如破壞搜索的精確度,具體取決于索引內(nèi)容的性質(zhì)。

boost

分析為查詢的字符串的多值列表,并將其分?jǐn)?shù)乘以所有匹配文檔的主查詢的分?jǐn)?shù)。此參數(shù)是使用 BoostQParserPlugin 來包裝 eDisMax 生成的查詢的簡(jiǎn)寫。

lowercaseOperators

指示是否將小寫“and”和“or”當(dāng)作與運(yùn)算符“AND”和“OR”相同的布爾型參數(shù)。默認(rèn)為false

ps

短語(yǔ) Slop。slop 的默認(rèn)量-術(shù)語(yǔ)之間的距離-在使用 pf、pf2 或 pf3 字段(影響 boosting)構(gòu)建的短語(yǔ)查詢中。另請(qǐng)參見下面的 “使用‘Slop’” 一節(jié)。

pf2

帶有可選權(quán)重的字段的多值列表。類似于pf,但是基于一對(duì)單詞 shingles。

ps2

這類似于ps但是覆蓋了用于pf2的 slop 因子。如果未指定,則使用ps。

pf3

一個(gè)多值字段列表,帶有可選的權(quán)重,基于單詞組的三聯(lián)體。類似pf,不同之處在于它不是在每個(gè)字段中使用輸入中的所有單詞構(gòu)建一個(gè)短語(yǔ),而是它會(huì)為每個(gè)字段生成單詞 “shingles”的三聯(lián)體。

ps3

類似于ps但是覆蓋了用于pf3的坡度因子。如果未指定,則使用ps。

stopwords

一個(gè)布爾參數(shù),指示StopFilterFactory在解析查詢時(shí)是否應(yīng)該遵守查詢分析器中的配置。如果設(shè)置為false,那么StopFilterFactory在查詢分析器中被忽略。

uf

指定允許最終用戶明確查詢的架構(gòu)字段。該參數(shù)支持通配符。默認(rèn)是允許所有的字段,相當(dāng)于uf=*。只允許標(biāo)題字段使用uf=title。要允許標(biāo)題和以'_s' 結(jié)尾的所有字段,請(qǐng)使用uf=title,*_s。要允許除標(biāo)題以外的所有字段,請(qǐng)使用uf=*,-title。要禁止所有派出的搜索,請(qǐng)使用uf=-*。

使用 Per-Field qf 覆蓋的字段別名

可以指定 qf 參數(shù)的 Per-field 覆蓋,以提供在查詢字符串中指定的字段名的1到多個(gè)別名,用于在底層查詢中使用的字段名。默認(rèn)情況下,不使用別名,并將查詢字符串中指定的字段名稱視為索引中的文字字段名稱。

eDismax 查詢的示例

本節(jié)中的所有示例 URL 都假定您正在運(yùn)行 Solr 的 techproducts 示例:

bin/solr -e techproducts

根據(jù)文檔的流行度提升查詢?cè)~ “hello” 的結(jié)果:

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

搜索 iPod 或視頻:

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

在多個(gè)字段中搜索,指定(通過 boosts)每個(gè)字段相對(duì)于彼此的重要性:

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

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

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

使用“mm”參數(shù),1和2個(gè)單詞查詢要求所有可選子句匹配,但對(duì)于具有三個(gè)或更多子句的查詢,允許使用一個(gè)缺失子句:

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

在下面的示例中,我們看到 qf 參數(shù)的 per-field 覆蓋被用于查詢字符串中"name" 的別名:“l(fā)ast_name” 和 “first_name” 字段:

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

使用負(fù)面的 Boost

“查詢”對(duì)象級(jí)長(zhǎng)時(shí)間支持負(fù)查詢提升(導(dǎo)致匹配文檔為負(fù)值)。現(xiàn)在 QueryParsers 已經(jīng)被更新來處理這個(gè)。

使用 “Slop”

Dismax 和 Edismax 可以針對(duì)所有查詢字段運(yùn)行查詢,還可以針對(duì)短語(yǔ)字段以短語(yǔ)的形式運(yùn)行查詢。但是,該短語(yǔ)查詢可能會(huì)有一個(gè)“slop”,這是查詢?cè)~語(yǔ)之間的距離,同時(shí)仍然將其視為詞組匹配。例如:

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

使用這些參數(shù),Dismax 查詢解析器生成一個(gè)如下所示的查詢:

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

但是它也會(huì)生成另一個(gè)只用于提高結(jié)果的查詢:

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

因此,任何有“foo”和“bar”這個(gè)詞的文檔都會(huì)匹配;然而,如果其中一些文件中有兩個(gè)詞作為短語(yǔ),那么它將得分高得多,因?yàn)樗嚓P(guān)。

如果添加參數(shù) ps(短語(yǔ) slop),則第二個(gè)查詢將改為:

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

這意味著如果在文檔中出現(xiàn)的術(shù)語(yǔ)“foo”和“bar”之間的術(shù)語(yǔ)互不超過10個(gè),那么這個(gè)短語(yǔ)就會(huì)匹配。例如文檔顯示:

*Foo* term1 term2 term3 *bar*

將匹配短語(yǔ)查詢。

如何使用短語(yǔ)slop?通常它是在請(qǐng)求處理程序(in solrconfig)中配置的。

使用查詢slop(qs)的概念是相似的,但它適用于來自用戶的顯式短語(yǔ)查詢。例如,如果您要搜索名稱,則可以輸入:

q="Hans Anderson"

包含“漢斯·安德森”的文件將匹配,但包含中間名“基督徒”或名稱是先寫姓(“安德森,漢斯”)的文件不會(huì)。對(duì)于這些情況,可以配置查詢字段qs,以便即使用戶搜索明確的短語(yǔ)查詢,也會(huì)應(yīng)用slop。

最后,除了fields(pf)參數(shù)這個(gè)短語(yǔ)外,edismax還支持pf2和pf3參數(shù),用于創(chuàng)建bigram和trigram短語(yǔ)查詢的字段。這些參數(shù)的查詢語(yǔ)句slop可以分別使用ps2和ps3參數(shù)來指定。如果使用pf2/ pf3但ps2/ ps3,那么這些參數(shù)的查詢語(yǔ)句會(huì)從ps參數(shù)中取出,如果有的話。

使用 “Magic Fields”:_val_ 和 _query_

Solr 查詢解析器中 _val_ 和 _query_ 的用法與 Lucene 查詢解析器中的不同之處在于下列幾處:

  • 如果 magic 字段名稱:_val_ 在術(shù)語(yǔ)或短語(yǔ)查詢中使用,則將該值作為函數(shù)進(jìn)行分析。
  • 它為 FunctionQuery 語(yǔ)法提供了一個(gè) hook。包含括號(hào)的函數(shù)需要使用引號(hào)。例如:
    _val_:myfield _val_:"recip(rord(myfield),1,2,3)"
  • Solr 查詢解析器為任何類型的查詢解析器(通過 QParserPlugin)提供了嵌套的查詢支持。如果嵌套查詢包含保留字符,則通常需要引用封裝。例如:
    _query_:"{!dismax qf=myfield}how now brown cow"
以上內(nèi)容是否對(duì)您有幫助:
在線筆記
App下載
App下載

掃描二維碼

下載編程獅App

公眾號(hào)
微信公眾號(hào)

編程獅公眾號(hào)