Solr查询:eDisMax查询解析器详解

Solr查询:eDisMax查询解析器详解

概述

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

除了支持所有DisMax查询解析器参数外,扩展DisMax还提供以下功能:

  • 支持标准查询解析器语法,例如(非完整列表):
    ** 布尔操作符,如AND(+,&&)、OR(||)、NOT(-)
    ** 可选择将小写的”and”和”or”视为Lucene语法模式下的”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的不同:

  • 如果查询包含除”AND”之外的显式操作符(”-“、”+”、”OR”、”NOT”);或者q.op是”OR”或未指定,则默认mm值为0%
  • 如果q.op是”AND”且查询不包含除”AND”之外的任何显式操作符,则默认mm值为100%

mm.autoRelax

如果为true,如果子句从某些而不是所有qf字段中被删除(例如,通过停用词过滤器),则所需的子句数将自动放宽。
如果您遇到由于qf字段之间不均匀的停用词删除而导致查询返回零命中的情况,请使用此参数作为解决方法。

注意,放宽mm可能会导致不希望的副作用,例如根据索引内容的性质损害搜索的精度。

boost

一个多值字符串列表,解析为函数,其结果将乘以所有匹配文档的主查询分数。
此参数是使用BoostQParserPlugin包装eDisMax生成的查询的简写。

以下两个示例是等效的:

1
2
q={!edismax qf=name}ipod
boost=div(1,sum(1,price))
1
2
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

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
2
3
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”字段:

1
2
3
4
defType=edismax
q=sysadmin name:Mike
qf=title text last_name first_name
f.name.qf=last_name first_name

使用’滑动’

DisMaxeDisMax可以对所有查询字段运行查询,还可以对短语字段以短语形式运行查询(这只适用于提升文档,不是实际匹配)。
然而,该短语查询可以有’滑动’,这是查询术语之间的距离,同时仍然将其视为短语匹配。
例如:

1
2
3
4
q=foo bar
qf=field1^5 field2^10
pf=field1^50 field2^20
defType=dismax

使用这些参数,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还支持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"

本文档翻译自Apache Solr官方参考指南,旨在为中文用户提供完整的eDisMax查询解析器使用指南。

© 2025 Solr Community of China All Rights Reserved. 本站访客数人次 本站总访问量
Theme by hiero