扩展 DisMax (eDisMax) 查询解析器

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

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

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

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

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

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

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

  • 通过使用词组来改进邻近度提升;在应用邻近度提升之前,无需查询匹配文档中的所有单词。

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

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

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

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

扩展 DisMax 参数

除了所有 DisMax 参数 之外,扩展 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 参数识别出匹配文档的列表,就可以使用 pf 参数来“提升”文档的分数,在 q 参数中的所有术语都出现在近距离的情况下。

格式与 qf 参数使用的格式相同:字段列表和“提升”,在从整个 q 参数中生成短语查询时将这些字段和“提升”与之关联。

ps

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

pf2

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

ps2

这类似于 ps,但会覆盖用于 pf2 的模糊因子。如果未指定,则使用 ps

pf3

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

ps3

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

停用词

一个布尔参数,指示解析查询时是否应遵循在查询分析器中配置的 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参数的按字段覆盖,以提供从查询字符串中指定的字段名称到基础查询中使用的字段名称的 1 对多别名。默认情况下,不使用别名,并且查询字符串中指定的字段名称被视为索引中的文字字段名称。

eDisMax 查询示例

本部分中的所有示例 URL 假设您正在运行 Solr 的“techproducts”示例

bin/solr -e techproducts

根据文档的流行度提升查询词“hello”的结果

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

跨多个字段进行搜索,指定(通过提升)每个字段相对于其他字段的重要性

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

您可以提升具有与特定值匹配的字段的结果

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

使用mm参数,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参数的按字段覆盖被用于将查询字符串中的“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

使用“Slop”

DismaxEdismax可以在所有查询字段上运行查询,也可以在短语字段上以短语形式运行查询(这仅适用于提升文档,实际上不适用于匹配)。但是,该短语查询可以具有“slop”,它是查询词之间的距离,同时仍将其视为短语匹配。例如

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(短语 slop),则第二个查询将变为

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

这意味着,如果术语“foo”和“bar”出现在文档中,并且彼此之间的术语少于 10 个,则该短语将匹配。例如,文档中写道

*Foo* term1 term2 term3 *bar*

将匹配短语查询。

如何使用短语 slop?通常在请求处理程序(在 solrconfig 中)中对其进行配置。

对于查询 slop (qs),概念类似,但它适用于用户明确的短语查询。例如,如果你想搜索一个名称,你可以输入

q="Hans Anderson"

包含“Hans Anderson”的文档将匹配,但包含中间名“Christian”或姓名以姓氏开头(“Anderson, Hans”)的文档将不会匹配。对于这些情况,可以配置查询字段 qs,这样即使用户搜索明确的短语查询,也会应用 slop。

最后,除了短语字段 (pf) 参数之外,edismax 还支持 pf2pf3 参数,用于创建二元组和三元组短语查询的字段。可以使用 ps2ps3 参数分别指定这些参数查询的短语 slop。如果你使用 pf2/pf3 但不使用 ps2/ps3,则这些参数查询的短语 slop 将从 ps 参数(如果存在)中获取。

带有 slop 的短语查询中的同义词扩展

当带有 slop 的短语查询(例如,带有 pspf)触发同义词扩展时,将为每个同义词组合生成一个单独的子句。例如,使用配置的同义词 dog,caninecat,feline,查询 "dog chased cat" 将生成以下短语查询子句

  • "dog chased cat"

  • "canine chased cat"

  • "dog chased feline"

  • "canine chased feline"