扩展 DisMax (eDisMax) 查询解析器
扩展 DisMax (eDisMax) 查询解析器是 DisMax 查询解析器 的改进版本。
除了支持所有 DisMax 查询解析器参数外,扩展 DisMax
-
支持 标准查询解析器 语法,例如(非详尽列表)
-
布尔运算符,例如 AND (+, &&)、OR (||)、NOT (-)。
-
在 Lucene 语法模式下,可以选择将小写的“and”和“or”视为“AND”和“OR”
-
可以选择使用其他查询解析器或函数嵌入查询
-
-
在出现语法错误的情况下,包括改进的智能部分转义;字段查询、+/- 和短语查询在此模式下仍然受支持。
-
通过使用词组来改进邻近度提升;在应用邻近度提升之前,无需查询匹配文档中的所有单词。
-
包括高级停用词处理:停用词在查询的强制部分中不是必需的,但仍然在邻近度提升部分中使用。如果查询由所有停用词组成,例如“to be or not to be”,则需要所有单词。
-
包括改进的提升函数:在扩展 DisMax 中,
boost
函数是一个乘数 而不是加数,从而改善了提升结果;DisMax 的加法提升函数(bf
和bq
)也受支持。 -
支持纯否定嵌套查询:例如
+foo (-foo)
的查询将匹配所有文档。 -
允许您指定终端用户允许查询的字段,并禁止直接字段搜索。
扩展 DisMax 参数
除了所有 DisMax 参数 之外,扩展 DisMax 包含这些查询参数
sow
-
按空格拆分。如果设置为
true
,则为每个单独的空格分隔术语分别调用文本分析。默认值为false
;空格分隔术语序列将一次性提供给文本分析,从而启用对术语序列进行操作的分析过滤器的正确功能,例如多词同义词和分词。 mm
-
最小应匹配。有关
mm
的说明,请参见 DisMaxmm
参数。默认 eDisMaxmm
值不同于 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
-
短语字段。一旦使用
fq
和qf
参数识别出匹配文档的列表,就可以使用pf
参数来“提升”文档的分数,在 q 参数中的所有术语都出现在近距离的情况下。格式与
qf
参数使用的格式相同:字段列表和“提升”,在从整个 q 参数中生成短语查询时将这些字段和“提升”与之关联。 ps
-
短语模糊。使用
pf
、pf2
和/或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_
来明确启用此功能。
-
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”
Dismax
和Edismax
可以在所有查询字段上运行查询,也可以在短语字段上以短语形式运行查询(这仅适用于提升文档,实际上不适用于匹配)。但是,该短语查询可以具有“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
还支持 pf2
和 pf3
参数,用于创建二元组和三元组短语查询的字段。可以使用 ps2
和 ps3
参数分别指定这些参数查询的短语 slop。如果你使用 pf2
/pf3
但不使用 ps2
/ps3
,则这些参数查询的短语 slop 将从 ps
参数(如果存在)中获取。