DisMax 查询解析器

DisMax 查询解析器旨在处理用户输入的简单短语(不带复杂语法),并使用不同的权重(提升)跨多个字段搜索各个术语,该权重基于每个字段的重要性。其他选项使用户能够根据特定于每个用例的规则(独立于用户输入)影响分数。

通常,DisMax 查询解析器的界面更像 Google,而不是“lucene”Solr 查询解析器的界面。这种相似性使 DisMax 成为许多消费者应用程序的合适查询解析器。它接受简单的语法,并且很少产生错误消息。

DisMax 查询解析器支持 Lucene QueryParser 语法的极简子集。与 Lucene 中一样,引号可用于对短语进行分组,而 +/- 可用于表示强制子句和可选子句。所有其他 Lucene 查询解析器特殊字符(AND 和 OR 除外)均已转义,以简化用户体验。DisMax 查询解析器负责使用包含跨字段 DisMax 查询和用户指定的提升的布尔子句,从用户的输入构建一个好的查询。它还允许 Solr 管理员提供其他提升查询、提升函数和过滤查询,以人为地影响所有搜索的结果。所有这些选项都可以指定为 solrconfig.xml 文件中请求处理程序的默认参数,或在 Solr 查询 URL 中覆盖。

对 DisMax 名称背后的技术概念感兴趣吗?DisMax 代表最大析取。以下是最大析取或“DisMax”查询的定义

生成其子查询产生的文档的并集的查询,并为每个文档评分,该评分为任何子查询产生的该文档的最大评分,加上任何其他匹配子查询的平局打破增量。

无论您是否记得这个解释,请记住,DisMax 查询解析器最初设计为易于使用,并且可以接受几乎任何输入,而不会返回错误。

DisMax 查询解析器参数

除了常见的请求参数、高亮显示参数和简单分面参数之外,DisMax 查询解析器还支持下面描述的参数。与标准查询解析器一样,DisMax 查询解析器允许在 solrconfig.xml 中指定默认参数值,或在请求中由查询时值覆盖。

以下部分详细说明了这些参数。

q 参数

q 参数定义构成搜索本质的主要“查询”。该参数支持用户提供的原始输入字符串,无需特殊转义。+ 和 - 字符被视为术语的“强制”和“禁止”修饰符。用平衡引号字符(例如,“San Jose”)包装的文本被视为短语。任何包含奇数个引号字符的查询都将被评估为根本没有引号字符。

q 参数不支持通配符,例如 *。

q.alt 参数

如果指定,当未指定或为空主 q 参数时,q.alt 参数定义一个查询(默认情况下将使用标准查询解析语法解析)。当您需要类似于匹配所有文档的查询(别忘了 &rows=0)以获取全集合分面计数时,q.alt 参数非常有用。

qf(查询字段)参数

qf 参数引入一个字段列表,每个字段都分配了一个提升因子,以增加或减少该特定字段在查询中的重要性。例如,以下查询

qf="fieldOne^2.3 fieldTwo fieldThree^0.4"

fieldOne 分配 2.3 的提升,将 fieldTwo 保留为默认提升(因为未指定提升因子),并将 fieldThree 分配为 0.4 的提升。这些提升因子使 fieldOne 中的匹配比 fieldTwo 中的匹配重要得多,而后者又比 fieldThree 中的匹配重要得多。

mm(最小应匹配)参数

在处理查询时,有三种类型的子句:必选子句、禁止子句和“可选”子句(也称为“应有”子句)。默认情况下,q 参数中指定的所有单词或短语均被视为“可选”子句,除非它们之前带有“+”或“-”。在处理这些“可选”子句时,mm 参数可以指定这些子句中必须匹配的最小数量。DisMax 查询解析器在指定最小数量的方式上提供了极大的灵活性。

下表说明了指定 mm 值的各种方式。

语法 示例 说明

正整数

3

定义必须匹配的子句的最小数量,无论总共有多少子句。

负整数

-2

将匹配子句的最小数量设置为可选子句的总数减去此值。

百分比

75%

将匹配子句的最小数量设置为可选子句总数的此百分比。从百分比计算出的数字向下舍入并用作最小值。

负百分比

-25%

表示可选子句总数的此百分比可以缺失。从百分比计算出的数字向下舍入,然后从总数中减去以确定最小数量。

以正整数开头的表达式,后跟 > 或 < 符号和另一个值

3<90%

定义一个条件表达式,表示如果可选子句的数量等于(或小于)整数,则它们都是必需的,但如果它大于整数,则该规范适用。在此示例中:如果有 1 到 3 个子句,则它们都是必需的,但对于 4 个或更多子句,只有 90% 是必需的。

涉及 > 或 < 符号的多个条件表达式

2<-25% 9<-3

定义多个条件,每个条件仅对大于前一个条件的数字有效。在左边的示例中,如果有 1 或 2 个子句,则两个子句都是必需的。如果有 3-9 个子句,则除了 25% 之外,所有子句都是必需的。如果有 9 个以上的子句,则除了三个之外,所有子句都是必需的。

指定mm值时,请记住以下内容

  • 处理百分比时,可以使用负值来在边缘情况下获得不同的行为。处理 4 个子句时,75% 和 -25% 的含义相同,但处理 5 个子句时,75% 意味着需要 3 个,而 -25% 意味着需要 4 个。

  • 如果基于参数参数的计算确定不需要任何可选子句,则布尔查询的常规规则仍适用于搜索时间。(也就是说,不包含任何必需子句的布尔查询仍必须至少匹配一个可选子句)。

  • 无论计算得出的数字是多少,Solr 永远不会使用大于可选子句数或小于 1 的值。换句话说,无论计算结果有多低或多高,必需匹配的最小数量永远不会少于 1 或大于子句数。

  • 在配置了不同查询分析器的多个字段中进行搜索时,不同字段之间的可选子句数可能不同。在这种情况下,mm 指定的值适用于可选子句的最大数量。例如,如果查询子句被视为其中一个字段的停用词,则该字段的可选子句数将小于其他字段。如果 mm 设置为 100%,则带有此类停用词子句的查询将不会在该字段中返回匹配项,因为已删除的子句不被视为已匹配。

mm的默认值为 0%(所有子句可选),除非将q.op指定为“AND”,在这种情况下,mm默认为 100%(所有子句必需)。

pf(短语字段)参数

使用fqqf参数识别匹配文档的列表后,可以使用pf参数在 q 参数中的所有术语都非常接近的情况下“提升”文档的分数。

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

ps(短语容差)参数

ps 参数指定应用于使用 pf 参数指定查询的“短语松散度”。短语松散度是一个令牌需要相对于另一个令牌移动的位置数,以便匹配查询中指定的短语。

qs(查询短语松散度)参数

qs 参数指定用户查询字符串中使用 qf 参数明确包含的短语查询允许的松散度。如上所述,松散度是指一个令牌需要相对于另一个令牌移动的位置数,以便匹配查询中指定的短语。

tie(平局打破者)参数

tie 参数指定一个浮点数(应远小于 1)在 DisMax 查询中用作平局打破者。

当用户输入中的一个术语针对多个字段进行测试时,可能有多个字段匹配。如果是这样,每个字段都会根据该单词在该字段中的常见程度(对于每个文档相对于所有其他文档)生成不同的分数。tie 参数允许您控制查询的最终分数将受到较低评分字段的分数与最高评分字段的分数相比的影响程度。

值“0.0” - 默认值 - 使查询成为纯“析取最大查询”:即,只有最高评分的子查询才有助于最终分数。值“1.0”使查询成为纯“析取和查询”,其中最高评分子查询是什么并不重要,因为最终分数将是子查询分数的总和。通常,低值(例如 0.1)很有用。

bq(提升查询)参数

bq 参数指定一个附加的可选查询子句,该子句将作为可选子句添加到用户的查询中,这些子句将影响分数。例如,如果您想为特定类别中的文档添加提升,可以使用

q=cheese
bq=category:food^10

您可以指定多个 bq 参数,每个参数都将作为具有单独提升的单独子句添加。

q=cheese
bq=category:food^10
bq=category:deli^5

以这种方式使用 bq 参数在功能上等同于将 qbq 参数合并到一个更大的布尔查询中,其中(原始)q 参数是“强制性的”,而其他子句是可选的

q=(+cheese category:food^10 category:deli^5)

上述示例之间的唯一区别在于,使用 bq 参数允许您独立于主查询指定这些额外子句(即,作为配置默认值)。

加法增强与乘法增强

一般来说,使用 bq(或以下的 bf)被认为是一种糟糕的通过辅助查询“增强”文档的方式,因为它对最终得分有“加法”效果。特定 bq 参数对给定文档的总体影响可能会有很大差异,具体取决于原始查询以及 bq 查询的得分的绝对值,而后者又取决于原始查询的复杂性和各种评分因素(TF、IDF、平均字段长度等)。

“乘法增强”通常被认为是影响文档得分的更可预测的方法,因为它充当“缩放因子”——按相对数量增加(或减少)每个文档的得分。

{!boost} QParser 提供了一个方便的包装器来实现乘法增强,而 {!edismax} QParser 提供了一个 boost 查询参数快捷方式来使用它。

bf(增强函数)参数

bf 参数指定将用于构建 FunctionQueries 的函数(带有可选的 查询增强),这些函数将被添加到用户的作为影响得分的可选子句的主查询中。任何 Solr 本机支持的 函数 都可以使用,以及增强值。例如

q=cheese
bf=div(1,sum(1,price))^1.5

使用 bf 参数指定函数实际上只是使用 bq 参数(具有相同的缺点)与 {!func} 解析器结合使用的简写,同时添加了简化的“查询提升”语法。

例如,下面列出的两个 bf 参数与下面的两个 bq 参数完全等效

bf=div(sales_rank,ms(NOW,release_date))
bf=div(1,sum(1,price))^1.5
bq={!func}div(sales_rank,ms(NOW,release_date))
bq={!lucene}( {!func v='div(1,sum(1,price))'} )^1.5

提交到 DisMax 查询解析器的查询示例

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

bin/solr -e techproducts

使用标准查询解析器搜索单词“video”的结果,并且我们假定“df”指向要搜索的字段

http://localhost:8983/solr/techproducts/select?q=video&fl=name+score

“dismax”解析器被配置为在文本、特征、名称、sku、id、manu 和 cat 字段中进行搜索,所有这些字段都具有不同的提升,旨在确保“更好的”匹配项首先出现,具体来说:在名称和 cat 字段中匹配的文档获得更高的分数。

http://localhost:8983/solr/techproducts/select?defType=dismax&q=video

请注意,此实例还配置了默认字段列表,可以在 URL 中覆盖该列表。

http://localhost:8983/solr/techproducts/select?defType=dismax&q=video&fl=*,score

您还可以覆盖要搜索的字段以及每个字段获得的提升程度。

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

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

http://localhost:8983/solr/techproducts/select?defType=dismax&q=video&bq=cat:electronics^5.0

另一个请求处理程序注册在“/instock”中,并且具有略微不同的配置选项,特别是:用于(您猜对了)inStock:true) 的过滤器。

http://localhost:8983/solr/techproducts/select?defType=dismax&q=video&fl=name,score,inStock

http://localhost:8983/solr/techproducts/instock?defType=dismax&q=video&fl=name,score,inStock

此解析器中的另一个非常酷的功能是对指定“BooleanQuery.minimumNumberShouldMatch”的强大支持,您希望根据用户查询中包含的术语数量来使用该功能。这为错别字和部分匹配提供了灵活性。对于 dismax 解析器,一词和两词查询要求所有可选子句都匹配,但对于三到五词查询,允许缺少一个词。

http://localhost:8983/solr/techproducts/select?defType=dismax&q=belkin+ipod

http://localhost:8983/solr/techproducts/select?defType=dismax&q=belkin+ipod+gibberish

http://localhost:8983/solr/techproducts/select?defType=dismax&q=belkin+ipod+apple

使用 debugQuery 选项查看已解析的查询以及每个文档的分数说明。

http://localhost:8983/solr/techproducts/select?defType=dismax&q=belkin+ipod+gibberish&debugQuery=true

http://localhost:8983/solr/techproducts/select?defType=dismax&q=video+card&debugQuery=true