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.alt
参数定义一个查询(默认情况下将使用标准查询解析语法进行解析)。当您需要诸如匹配所有文档的查询(不要忘记 &rows=0
!)以便获得整个集合的分面计数时,q.alt
参数会派上用场。
qf (查询字段) 参数
qf
参数引入一个字段列表,其中每个字段都被分配一个提升因子,以增加或减少该特定字段在查询中的重要性。例如,以下查询
qf="fieldOne^2.3 fieldTwo fieldThree^0.4"
将 fieldOne
的提升因子设置为 2.3,fieldTwo
保留默认提升因子(因为没有指定提升因子),fieldThree
的提升因子设置为 0.4。这些提升因子使得 fieldOne
中的匹配比 fieldTwo
中的匹配重要得多,而 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 个以上的子句,则除 3 个以外的所有子句都是必需的。 |
在指定 mm
值时,请记住以下几点
-
在处理百分比时,可以使用负值来获得边缘情况下的不同行为。当处理 4 个子句时,75% 和 -25% 的含义相同,但是当处理 5 个子句时,75% 表示需要 3 个子句,而 -25% 表示需要 4 个子句。
-
如果基于参数参数的计算确定不需要可选子句,则有关布尔查询的常用规则仍然在搜索时适用。(也就是说,包含不要求子句的布尔查询仍然必须匹配至少一个可选子句)。
-
无论计算得出什么数字,Solr 都不会使用大于可选子句数量的值,也不会使用小于 1 的值。换句话说,无论计算结果有多低或多高,所需匹配的最小数量永远不会小于 1 或大于子句的数量。
-
当跨多个配置了不同查询分析器的字段进行搜索时,字段之间的可选子句数量可能会有所不同。在这种情况下,mm 指定的值适用于可选子句的最大数量。例如,如果一个查询子句被视为某个字段的停用词,则该字段的可选子句数量将小于其他字段。如果 mm 设置为 100%,则带有此类停用词子句的查询将不会在该字段中返回匹配项,因为删除的子句不计为匹配项。
mm
的默认值为 0%(所有子句都是可选的),除非将 q.op
指定为“AND”,在这种情况下,mm
默认为 100%(所有子句都是必需的)。
pf(短语字段)参数
在使用 fq
和 qf
参数识别出匹配文档列表后,可以使用 pf
参数来“提升”文档的分数,在 q
参数中的所有词条都以紧密临近的方式出现的情况下。
格式与 qf
参数使用的格式相同:字段列表和“提升”,以便在从整个 q 参数中生成短语查询时将它们关联起来。
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
参数在功能上等同于将 q
和 bq
参数组合成一个更大的布尔查询,其中(原始)q
参数是“强制性的”,而其他子句是可选的
q=(+cheese category:food^10 category:deli^5)
以上示例之间的唯一区别是,使用 bq
参数允许您独立于主查询(即作为配置默认值)指定这些额外的子句。
加性提升与乘性提升
一般来说,使用 “乘性提升”通常被认为是影响文档分数的更可预测的方法,因为它充当“缩放因子” — 将每个文档的分数增加(或减少)相对数量。
|
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 start -e techproducts
使用标准查询解析器查找单词“video”的结果,我们假设“df”指向要搜索的字段
https://127.0.0.1:8983/solr/techproducts/select?q=video&fl=name+score
“dismax”解析器配置为在文本、功能、名称、sku、id、manu 和 cat 字段中搜索,所有这些字段都具有不同的提升,旨在确保“更好”的匹配首先出现,具体而言:在名称和 cat 字段中匹配的文档会获得更高的分数。
https://127.0.0.1:8983/solr/techproducts/select?defType=dismax&q=video
请注意,此实例还配置了默认字段列表,该列表可以在 URL 中被覆盖。
https://127.0.0.1:8983/solr/techproducts/select?defType=dismax&q=video&fl=*,score
您还可以覆盖搜索的字段以及每个字段获得的提升量。
https://127.0.0.1:8983/solr/techproducts/select?defType=dismax&q=video&qf=features^20.0+text^0.3
您可以提升具有与特定值匹配的字段的结果。
https://127.0.0.1:8983/solr/techproducts/select?defType=dismax&q=video&bq=cat:electronics^5.0
另一个请求处理程序在“/instock”注册,并且具有略有不同的配置选项,特别是:inStock:true)
的过滤器(您猜对了)。
https://127.0.0.1:8983/solr/techproducts/select?defType=dismax&q=video&fl=name,score,inStock
https://127.0.0.1:8983/solr/techproducts/instock?defType=dismax&q=video&fl=name,score,inStock
此解析器中另一个非常酷的功能是强大地支持基于用户查询中的词条数量指定要使用的“BooleanQuery.minimumNumberShouldMatch”。这使得可以灵活地处理拼写错误和部分匹配。对于 dismax 解析器,一个和两个词的查询要求所有可选子句都匹配,但对于三到五个词的查询,允许缺少一个词。
https://127.0.0.1:8983/solr/techproducts/select?defType=dismax&q=belkin+ipod
https://127.0.0.1:8983/solr/techproducts/select?defType=dismax&q=belkin+ipod+gibberish
https://127.0.0.1:8983/solr/techproducts/select?defType=dismax&q=belkin+ipod+apple
使用 debugQuery 选项查看已解析的查询以及每个文档的分数说明。
https://127.0.0.1:8983/solr/techproducts/select?defType=dismax&q=belkin+ipod+gibberish&debugQuery=true
https://127.0.0.1:8983/solr/techproducts/select?defType=dismax&q=video+card&debugQuery=true