Solr查询:eDisMax查询解析器详解
概述
扩展DisMax(eDisMax)查询解析器是DisMax查询解析器的改进版本。
除了支持所有DisMax查询解析器参数外,扩展DisMax还提供以下功能:
- 支持标准查询解析器语法,例如(非完整列表):
** 布尔操作符,如AND(+,&&)、OR(||)、NOT(-)
** 可选择将小写的”and”和”or”视为Lucene语法模式下的”AND”和”OR”
** 可选择允许使用其他查询解析器或函数的嵌入式查询 - 在语法错误情况下包含改进的智能部分转义;在此模式下仍然支持字段查询、+/-和短语查询
- 通过使用词片段改进邻近度提升;在应用邻近度提升之前,不需要查询匹配文档中的所有词
- 包含高级停用词处理:停用词在查询的必需部分不是必需的,但仍在邻近度提升部分中使用。如果查询完全由停用词组成,如”to be or not to be”,那么所有词都是必需的
- 包含改进的提升函数:在扩展DisMax中,
boost
函数是一个乘数而不是加数,从而改进您的提升结果;DisMax的加法提升函数(bf
和bq
)也受到支持 - 支持纯负嵌套查询:如
+foo (-foo)
这样的查询将匹配所有文档 - 允许您指定最终用户可以查询的字段,并禁止直接字段搜索
扩展DisMax参数
除了所有DisMax参数外,扩展DisMax还包括以下查询参数:
sow
分割空白字符。
如果设置为true
,将为每个单独的空白分隔的术语单独调用文本分析。
默认值为false
;空白分隔的术语序列将一次性提供给文本分析,从而使在术语序列上操作的分析过滤器能够正常工作,例如多词同义词和词片段。
mm
最小应该匹配。
有关mm
的描述,请参阅DisMax mm
参数。
默认的eDisMax mm
值与DisMax的不同:
- 如果查询包含除”AND”之外的显式操作符(”-“、”+”、”OR”、”NOT”);或者
q.op
是”OR”或未指定,则默认mm
值为0% - 如果
q.op
是”AND”且查询不包含除”AND”之外的任何显式操作符,则默认mm
值为100%
mm.autoRelax
如果为true
,如果子句从某些而不是所有qf
字段中被删除(例如,通过停用词过滤器),则所需的子句数将自动放宽。
如果您遇到由于qf
字段之间不均匀的停用词删除而导致查询返回零命中的情况,请使用此参数作为解决方法。
注意,放宽mm
可能会导致不希望的副作用,例如根据索引内容的性质损害搜索的精度。
boost
一个多值字符串列表,解析为函数,其结果将乘以所有匹配文档的主查询分数。
此参数是使用BoostQParserPlugin
包装eDisMax生成的查询的简写。
以下两个示例是等效的:
1 | q={!edismax qf=name}ipod |
1 | q={!boost b=div(1,sum(1,price)) v=$qq} |
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
。
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
中明确引用魔术字段_query_
来启用此功能
使用每字段qf覆盖的字段别名
可以指定qf
参数的每字段覆盖,以提供从查询字符串中指定的字段名称到底层查询中使用的字段名称的一对多别名。
默认情况下,不使用别名,查询字符串中指定的字段名称被视为索引中的字面字段名称。
eDisMax查询示例
本节中的所有示例URL都假设您正在运行Solr的”techproducts”示例:
1 | bin/solr start -e techproducts |
基于文档的受欢迎程度提升查询术语”hello”的结果:
1 | http://localhost:8983/solr/techproducts/select?defType=edismax&q=hello&pf=text&qf=text&boost=popularity |
搜索iPods OR video:
1 | http://localhost:8983/solr/techproducts/select?defType=edismax&q=ipod+OR+video |
跨多个字段搜索,指定(通过提升)每个字段相对于其他字段的重要性:
1 | http://localhost:8983/solr/techproducts/select?q=video&defType=edismax&qf=features^20.0+text^0.3 |
您可以提升具有匹配特定值字段的结果:
1 | 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词查询要求所有可选子句匹配,但对于三个或更多子句的查询,允许一个丢失的子句:
1 | http://localhost:8983/solr/techproducts/select?q=belkin+ipod&defType=edismax&mm=2 |
在下面的示例中,我们看到使用qf
参数的每字段覆盖将查询字符串中的”name”别名为”last_name”和”first_name”字段:
1 | defType=edismax |
使用’滑动’
DisMax
和eDisMax
可以对所有查询字段运行查询,还可以对短语字段以短语形式运行查询(这只适用于提升文档,不是实际匹配)。
然而,该短语查询可以有’滑动’,这是查询术语之间的距离,同时仍然将其视为短语匹配。
例如:
1 | q=foo bar |
使用这些参数,DisMax查询解析器生成类似这样的查询:
1 | (+(field1:foo^5 OR field2:foo^10) AND (field1:bar^5 OR field2:bar^10)) |
但它还生成另一个只用于提升结果的查询:
1 | field1:"foo bar"^50 OR field2:"foo bar"^20 |
因此,任何具有术语”foo”和”bar”的文档都将匹配;但是,如果其中一些文档将这两个术语作为短语,它将得分更高,因为它更相关。
如果添加参数ps
(短语滑动),第二个查询将改为:
1 | ps=10 field1:"foo bar"~10^50 OR field2:"foo bar"~10^20 |
这意味着如果术语”foo”和”bar”在文档中出现时彼此之间少于10个术语,短语将匹配。
例如说以下文档:
1 | *Foo* term1 term2 term3 *bar* |
将匹配短语查询。
如何使用短语滑动?通常在请求处理程序中(在solrconfig
中)配置。
使用查询滑动(qs
),概念类似,但它适用于用户的显式短语查询。
例如,如果您想搜索姓名,可以输入:
1 | q="Hans Anderson" |
包含”Hans Anderson”的文档将匹配,但包含中间名”Christian”的文档或姓氏在前的姓名(”Anderson, Hans”)不会匹配。
对于这些情况,可以配置查询字段qs
,这样即使用户搜索显式短语查询,也会应用滑动。
最后,除了短语字段(pf
)参数外,edismax
还支持pf2
和pf3
参数,用于创建二元组和三元组短语查询的字段。
这些参数查询的短语滑动可以分别使用ps2
和ps3
参数指定。
如果您使用pf2
/pf3
但不使用ps2
/ps3
,那么这些参数查询的短语滑动将从ps
参数中获取(如果有的话)。
带滑动的短语查询中的同义词扩展
当带滑动的短语查询(例如带ps
的pf
)触发同义词扩展时,将为同义词的每个组合生成单独的子句。
例如,配置同义词dog,canine
和cat,feline
,查询"dog chased cat"
将生成以下短语查询子句:
"dog chased cat"
"canine chased cat"
"dog chased feline"
"canine chased feline"
本文档翻译自Apache Solr官方参考指南,旨在为中文用户提供完整的eDisMax查询解析器使用指南。