Solr擴展的DisMax查詢解析器:eDismax

2018-11-24 15:50 更新

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

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

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

eDisMax 參數(shù)

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

sow

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

mm.autoRelax

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

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

boost

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

lowercaseOperators

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

ps

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

pf2

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

ps2

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

pf3

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

ps3

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

stopwords

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

uf

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

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

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

eDismax 查詢的示例

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

bin/solr -e techproducts

根據(jù)文檔的流行度提升查詢詞 “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

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

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個單詞查詢要求所有可選子句匹配,但對于具有三個或更多子句的查詢,允許使用一個缺失子句:

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

使用負面的 Boost

“查詢”對象級長時間支持負查詢提升(導致匹配文檔為負值)。現(xiàn)在 QueryParsers 已經(jīng)被更新來處理這個。

使用 “Slop”

Dismax 和 Edismax 可以針對所有查詢字段運行查詢,還可以針對短語字段以短語的形式運行查詢。但是,該短語查詢可能會有一個“slop”,這是查詢詞語之間的距離,同時仍然將其視為詞組匹配。例如:

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

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

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

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

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

因此,任何有“foo”和“bar”這個詞的文檔都會匹配;然而,如果其中一些文件中有兩個詞作為短語,那么它將得分高得多,因為它更相關。

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

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

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

*Foo* term1 term2 term3 *bar*

將匹配短語查詢。

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

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

q="Hans Anderson"

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

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

使用 “Magic Fields”:_val_ 和 _query_

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

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

掃描二維碼

下載編程獅App

公眾號
微信公眾號

編程獅公眾號