扩展的 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 的加性提升函数(bf
和bq
)。 -
支持纯否定嵌套查询:诸如
+foo (-foo)
之类的查询将匹配所有文档。 -
让您指定允许最终用户查询的字段,并禁止直接字段搜索。
扩展的 DisMax 参数
除了所有 DisMax 参数之外,扩展的 DisMax 还包括以下查询参数
sow
-
按空格拆分。如果设置为
true
,则对每个单独的空格分隔的词分别调用文本分析。默认值为false
;空格分隔的词序列将一次性提供给文本分析,从而能够正确执行对词序列进行操作的分析过滤器,例如,多词同义词和 shingles。 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
类似,但基于单词对的 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_
来明确启用此功能。
-
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
使用“斜率”
Dismax
和 Edismax
可以针对所有查询字段运行查询,还可以针对短语字段以短语的形式运行查询(这将仅用于提升文档,而不是实际用于匹配)。但是,该短语查询可以具有“斜率”,即查询的术语之间的距离,同时仍然认为它是短语匹配。例如
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
还支持 pf2
和 pf3
参数,用于创建双字母组和三字母组短语查询的字段。可以使用 ps2
和 ps3
参数分别指定这些参数的查询的短语斜率。如果您使用 pf2
/pf3
但不使用 ps2
/ps3
,则这些参数的查询的短语斜率将取自 ps
参数(如果有)。