扩展的 DisMax (eDisMax) 查询解析器

扩展的 DisMax (eDisMax) 查询解析器是 DisMax 查询解析器的改进版本。

除了支持所有 DisMax 查询解析器参数外,扩展的 DisMax

  • 还支持 标准查询解析器语法,例如(非详尽列表)

    • 布尔运算符,如 AND (+, &&)、OR (||)、NOT (-)。

    • 可以选择在 Lucene 语法模式下将小写的“and”和“or”视为“AND”和“OR”

    • 可以选择允许使用其他查询解析器或函数的嵌入式查询

  • 在出现语法错误时,包括改进的智能部分转义;在这种模式下,仍然支持字段查询、+/- 和短语查询。

  • 通过使用单词 shingles 改进邻近度提升;您不需要查询匹配文档中的所有单词才能应用邻近度提升。

  • 包括高级停用词处理:停用词不是查询的强制部分所必需的,但仍用于邻近度提升部分。如果查询由所有停用词组成,例如“to be or not to be”,则所有单词都是必需的。

  • 包括改进的提升函数:在扩展的 DisMax 中,boost 函数是一个乘数,而不是一个加数,从而改进您的提升结果;还支持 DisMax 的加性提升函数(bfbq)。

  • 支持纯否定嵌套查询:诸如 +foo (-foo) 之类的查询将匹配所有文档。

  • 让您指定允许最终用户查询的字段,并禁止直接字段搜索。

扩展的 DisMax 参数

除了所有 DisMax 参数之外,扩展的 DisMax 还包括以下查询参数

sow

按空格拆分。如果设置为 true,则对每个单独的空格分隔的词分别调用文本分析。默认值为 false;空格分隔的词序列将一次性提供给文本分析,从而能够正确执行对词序列进行操作的分析过滤器,例如,多词同义词和 shingles。

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 参数标识出匹配的文档列表后,可以使用 pf 参数在 q 参数中的所有术语都紧密相邻的情况下“提升”文档的分数。

格式与 qf 参数使用的格式相同:一个字段列表和当从整个 q 参数构建短语查询时与每个字段关联的“提升”。

ps

短语斜率。使用 pfpf2 和/或 pf3 字段构建的短语查询的默认斜率量(术语之间的距离)(影响提升)。另请参阅下面的使用“斜率”部分。

pf2

具有可选权重的多值字段列表。与 pf 类似,但基于单词的 shingles。

ps2

这与 ps 类似,但会覆盖用于 pf2 的斜率因子。如果未指定,则使用 `ps`。

pf3

具有可选权重的多值字段列表,基于单词 shingles 的三元组。与 pf 类似,不同之处在于它不是根据输入中的所有单词为每个字段构建短语,而是根据单词三元组 shingles 为每个字段构建一组短语。

ps3

这与 ps 类似,但会覆盖用于 pf3 的斜率因子。如果未指定,则使用 ps

stopwords

一个布尔参数,指示在解析查询时是否应遵循查询分析器中配置的 StopFilterFactory。如果将其设置为 false,则会忽略查询分析器中的 StopFilterFactory

uf

指定允许最终用户显式查询的架构字段,并切换是否支持嵌入式 Solr 查询。此参数支持通配符。多个字段必须用空格分隔。

默认值是允许所有字段,并且不允许嵌入式 Solr 查询,等效于 uf=* -_query_

  • 要仅允许 title 字段,请使用 uf=title

  • 要允许 title 和所有以“_s”结尾的字段,请使用 uf=title *_s

  • 要允许除 title 之外的所有字段,请使用 uf=* -title

  • 要禁止所有字段搜索,请使用 uf=-*

  • 要允许嵌入式 Solr 查询(例如,_query_:"…​"_val_:"…​"{!lucene …​}),必须通过在 uf 中引用 magic 字段 _query_ 来明确启用此功能。

使用 Per-Field qf 覆盖的字段别名

可以指定 qf 参数的每个字段的覆盖,以提供从查询字符串中指定的字段名称到基础查询中使用的字段名称的 1 对多别名。默认情况下,不使用别名,查询字符串中指定的字段名称被视为索引中的文字字段名称。

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 OR 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"