DisMax查询解析器旨在处理用户输入的简单短语(没有复杂语法),并使用基于每个字段重要性的不同权重(加权)在多个字段中搜索个别词条。附加选项使用户能够基于每个用例特定的规则(独立于用户输入)来影响评分。
总的来说,DisMax查询解析器的界面更像Google,而不是’lucene’ Solr查询解析器的界面。这种相似性使DisMax成为许多消费者应用程序的合适查询解析器。它接受简单的语法,并且很少产生错误消息。
DisMax查询解析器支持Lucene QueryParser语法的极其简化的子集。与Lucene一样,引号可用于分组短语,+/-可用于表示必需和可选子句。所有其他Lucene查询解析器特殊字符(除了AND和OR)都被转义以简化用户体验。DisMax查询解析器负责使用包含跨字段DisMax查询的布尔子句和用户指定的加权从用户输入构建良好的查询。它还允许Solr管理员提供额外的增强查询、增强函数和过滤查询来人工影响所有搜索的结果。这些选项都可以在solrconfig.xml
文件中指定为请求处理程序的默认参数,或者在Solr查询URL中覆盖。
对DisMax名称背后的技术概念感兴趣吗?DisMax代表最大析取(Maximum Disjunction)。以下是最大析取或”DisMax”查询的定义:
一个查询,它生成其子查询产生的文档的并集,并为每个文档打分,分数是任何子查询为该文档产生的最大分数,加上任何额外匹配子查询的打平增量。
无论你是否记住这个解释,请记住DisMax查询解析器主要是为了易于使用而设计的,并且接受几乎任何输入而不返回错误。
DisMax查询解析器参数
除了通用请求参数、高亮参数和简单分面参数外,DisMax查询解析器还支持下面描述的参数。与标准查询解析器一样,DisMax查询解析器允许在solrconfig.xml
中指定默认参数值,或者通过请求中的查询时值覆盖。
下面各节详细解释这些参数。
q参数
q
参数定义构成搜索本质的主要”查询”。该参数支持用户提供的原始输入字符串,无需特殊转义。+和-字符被视为词条的”必需”和”禁止”修饰符。包在平衡引号字符中的文本(例如,”San Jose”)被视为短语。任何包含奇数引号字符的查询都被评估为好像根本没有引号字符。
重要:q
参数不支持通配符字符如*。
q.alt参数
如果指定,当主q参数未指定或为空时,q.alt
参数定义一个查询(默认情况下将使用标准查询解析语法进行解析)。当你需要类似匹配所有文档的查询(别忘了&rows=0
!)以获取集合范围的分面计数时,q.alt
参数很方便。
qf(查询字段)参数
qf
参数引入字段列表,每个字段都被分配一个增强因子来增加或减少该特定字段在查询中的重要性。例如,下面的查询:
1 | 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个子句,则除了3个之外的所有子句都是必需的 |
在指定mm
值时,请记住以下几点:
- 在处理百分比时,负值可用于在边缘情况下获得不同的行为。75%和-25%在处理4个子句时意思相同,但在处理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参数制作短语查询时与每个字段关联的”增强”。
ps(短语松弛)参数
ps
参数指定应用于使用pf参数指定的查询的”短语松弛”量。短语松弛是一个词条相对于另一个词条需要移动的位置数,以匹配查询中指定的短语。
qs(查询短语松弛)参数
qs
参数指定在用户查询字符串中使用qf
参数明确包含的短语查询上允许的松弛量。如上所述,松弛是指一个词条相对于另一个词条需要移动的位置数,以匹配查询中指定的短语。
tie(打平器)参数
tie
参数指定一个浮点值(应该远小于1)用作DisMax查询中的打平器。
当来自用户输入的词条与多个字段进行测试时,可能有多个字段匹配。如果是这样,每个字段将基于该词在该字段中有多常见(对每个文档相对于所有其他文档)生成不同的分数。tie
参数让你控制查询的最终分数将受到较低分数字段与最高分数字段相比的影响程度。
值”0.0” - 默认值 - 使查询成为纯”析取最大查询”:也就是说,只有最高分数子查询对最终分数有贡献。值”1.0”使查询成为纯”析取和查询”,其中最高分数子查询是什么并不重要,因为最终分数将是子查询分数的总和。通常,像0.1这样的低值是有用的。
bq(增强查询)参数
bq
参数指定一个额外的、可选的查询子句,该子句将作为可选子句添加到用户的主查询中,这些子句将影响分数。例如,如果你想为特定类别中的文档添加增强,你可以使用:
1 | q=cheese |
你可以指定多个bq
参数,每个都将作为具有单独增强的单独子句添加。
1 | q=cheese |
以这种方式使用bq
参数在功能上等同于将你的q
和bq
参数合并为一个更大的布尔查询,其中(原始)q
参数是”必需的”,其他子句是可选的:
1 | q=(+cheese category:food^10 category:deli^5) |
上面示例之间的唯一区别是,使用bq
参数允许你独立于主查询指定这些额外子句(即,作为配置默认值)。
提示:加法增强与乘法增强
一般来说,使用bq
(或下面的bf
)被认为是通过次要查询”增强”文档的糟糕方式,因为它对最终分数有”加法”效果。特定bq
参数对给定文档的整体影响可能会根据原始查询以及bq
查询的分数的绝对值而变化很大,这反过来取决于原始查询的复杂性和各种评分因素(TF、IDF、平均字段长度等)。
“乘法增强”通常被认为是影响文档分数的更可预测的方法,因为它充当”缩放因子” - 通过相对量增加(或减少)每个文档的分数。
{!boost}
QParser为实现乘法增强提供了方便的包装器,{!edismax}
QParser为使用它提供了boost
查询参数快捷方式。
bf(增强函数)参数
bf
参数指定函数(带有可选的查询增强),这些函数将用于构造FunctionQueries,作为可选子句添加到用户的主查询中,这些子句将影响分数。可以使用Solr原生支持的任何函数,以及增强值。例如:
1 | q=cheese |
使用bf参数指定函数本质上只是使用bq
参数(具有相同的缺点)与{!func}
解析器结合的简写 - 还有简化的”查询增强”语法的添加。
例如,下面列出的两个bf
参数完全等同于下面的两个bq
参数:
1 | bf=div(sales_rank,ms(NOW,release_date)) |
1 | bq={!func}div(sales_rank,ms(NOW,release_date)) |
提交到DisMax查询解析器的查询示例
本节中的所有示例URL都假设你正在运行Solr的”techproducts”示例:
1 | bin/solr start -e techproducts |
使用标准查询解析器对单词”video”的结果,我们假设”df”指向要搜索的字段:
1 | http://localhost:8983/solr/techproducts/select?q=video&fl=name+score |
“dismax”解析器配置为在text、features、name、sku、id、manu和cat字段中搜索,所有字段都有不同的增强,旨在确保”更好”的匹配首先出现,具体来说:在name和cat字段上匹配的文档获得更高的分数。
1 | http://localhost:8983/solr/techproducts/select?defType=dismax&q=video |
注意这个实例也配置了默认字段列表,可以在URL中覆盖。
1 | http://localhost:8983/solr/techproducts/select?defType=dismax&q=video&fl=*,score |
你也可以覆盖搜索哪些字段以及每个字段获得多少增强。
1 | http://localhost:8983/solr/techproducts/select?defType=dismax&q=video&qf=features^20.0+text^0.3 |
你可以增强有与特定值匹配的字段的结果。
1 | http://localhost:8983/solr/techproducts/select?defType=dismax&q=video&bq=cat:electronics^5.0 |
另一个请求处理程序注册在”/instock”并有稍微不同的配置选项,特别是:对inStock:true
的过滤器。
1 | http://localhost:8983/solr/techproducts/select?defType=dismax&q=video&fl=name,score,inStock |
1 | http://localhost:8983/solr/techproducts/instock?defType=dismax&q=video&fl=name,score,inStock |
这个解析器中另一个非常酷的特性是基于用户查询中有多少词条来强力支持指定你想要使用的”BooleanQuery.minimumNumberShouldMatch”。这允许拼写错误和部分匹配的灵活性。对于dismax解析器,一词和二词查询要求所有可选子句匹配,但对于三到五词查询允许缺少一个词。
1 | http://localhost:8983/solr/techproducts/select?defType=dismax&q=belkin+ipod |
1 | http://localhost:8983/solr/techproducts/select?defType=dismax&q=belkin+ipod+gibberish |
1 | http://localhost:8983/solr/techproducts/select?defType=dismax&q=belkin+ipod+apple |
使用debugQuery选项来查看解析的查询和每个文档的分数解释。
1 | http://localhost:8983/solr/techproducts/select?defType=dismax&q=belkin+ipod+gibberish&debugQuery=true |
1 | http://localhost:8983/solr/techproducts/select?defType=dismax&q=video+card&debugQuery=true |
总结
DisMax查询解析器是一个用户友好的查询工具,专为简化搜索体验而设计。它通过提供直观的语法、强大的多字段搜索能力和灵活的评分控制,使得构建面向用户的搜索应用变得简单。其最大析取的评分机制和丰富的增强选项,为开发者提供了平衡搜索精确性和用户体验的有效工具。