DisMax查询解析器设计的初衷是处理用户输入的简单短语(没有复杂语法),在多个根据不同含义使用不同权重的字段间进行搜索。另外还有额外的选项,使用户可以根据具体用例(根据用户的输入)影响打分。
总的来说,DisMax查询解析器比标准Solr查询请求更像Google的接口。对于许多付费应用,这种相似性使DisMax成为更加适当的查询解析器。她能够接收简单的语法,却很少发生错误。

DisMax查询解析器设计的初衷是处理用户输入的简单短语(没有复杂语法),在多个根据不同含义使用不同权重的字段间进行搜索。另外还有额外的选项,使用户可以根据具体用例(根据用户的输入)影响打分。
总的来说,DisMax查询解析器比标准Solr查询请求更像Google的接口。对于许多付费应用,这种相似性使DisMax成为更加适当的查询解析器。她能够接收简单的语法,却很少发生错误。
DisMax查询解析器支持非常简化的Lucene查询分析器语法的自己。在Lucene中,引用可以被用于group短语,+/-可以被用于表示。所有其他Lucene查询解析器的特殊字符(除了ANDOR)被舍弃,以便简化用户体验。DisMax查询解析器使用在DisMax查询多字段时的布尔表达式和指定加权来为用户构建更好的查询。也为Solr管理员对人工干预查询结果提供更好的查询、功能和过滤。搜有的这些参数都可以在solrconfig.xml文件中指定默认参数,或通过Solr查询URL重写。
对DisMax这个名字感兴趣吗?DisMax代表 Maximum Disjunction(最优分析)。下面是对 Maximum Disjunction(最优分析) 或DisMax查询:

注:通过子查询生成文档集合,对所有子查询的文档赋最高分,对额外的匹配查询添加系数的查询。

记不记得住这个解释都无所谓,只要知道DisMax简单易用,并且接收任何输入但几乎不发生错误。

DisMax参数

除了公用的查询参数、高亮参数、和简单的层面分析参数,DisMax查询解析器还支持一下参数。就像是标准查询解析器,DisMax查询解析器支持在solrconfig.xml中指定默认参数值,也支持在查询时通过请求参数指定参数值。

参数描述
q定义查询字符串
q.alt当`q`参数不使用时,调用标准查询分析器的输入字符串。
qfQuery Fields:指定索引中查询字段。如果没有指定,默认使用`df`。
mmMinimum "Should" Match:制定查询中必须匹配的最小规则数。如果没有在查询中或在`solrconfig.xml`文件中制定`mm`参数值,`q.op`参数的有效值(查询参数或`schemaconfig.xml`配置文件默认值,或`schema.xml`的`defaultOperator`的参数值)将产生影响。如果`q.op`是`AND`,zemm=100%,如果`q.op`是`OR`,则mm=1(100%表示全部匹配,1表示只要有一个匹配即可)。如果用户想修改这些行为,可以在`solrconfig.xml`文件中定义`mm`参数。用户应该将此参数作为请求的默认参数。这个参数允许在表达式中夹杂空格(比如:" 3 < -25% 10 &gr; -3\n", " \n-25%\n ", " \n3\n ")。
pfPhrase Fields: 为在`q`参数中定义的所有检索词匹配的文档提高分值。
psPhrase Slop: 指定两个检索词相隔的位置来匹配指定短语。
qsQuery Phrase Slop: 指定两个检索词相隔的位置来匹配指定短语。可以`qf`参数。
tieTie Breaker: 在DisMax查询中指定一个浮点数(大于0小于1)来作为关键值。
bqBoost Query: 指定一个单词或短语提升查询权重
bfBoost Functions: 指定用于提升查询权重的函数。
下面的章节详细解释这些参数。 ### q `q`参数定义了查询过程中的主查询结构。这个参数支持用户的原始输入。`+/-`视为`AND/OR`。在一对引号之间检索词(比如:"San Jose")的被解析为短语。含有奇数个引号的等同于没有引号。 >注:不支持通配符,比如*。

q.alt

当主参数q没有输入或是空,q.alt参数来定义查询()。q.alt参数可以很方便的获取匹配数量(最好加上参数&rows=0)。

qf(Query Fields)

qf参数可以对一系列字段指定权重,用来提高或降低其在查询中的重要性。比如:qf="fieldOne^2.3 fieldTwo fieldThree^0.4"
指定fieldOne权重为2.3,fieldTwo使用默认权重(因为没有指定权重),fieldThree权重为0.4。查询的时候,字段的重要性依次为fieldOne > fieldTwo > fieldThree

mm (Minimum Should Match)

执行查询时,Lucene/Solr可以识别三种查询规则:必须符合(且)、不符合(fei),以及可能符合(或称为应该符合,或)。默认情况下,q中定义的短语如果没用+-修饰,则应该符合“可能”规则(或)。当使用“可能”规则是,mm可以指定必须匹配的最小数量。DisMax查询解析器提供了非常灵活的指定最小数字的方法。
下面的表格解析了mm值的多种用法:

语法示例描述
正整数3定义最少匹配数量,无论有多少从句。
负正数-2设置最少匹配数量等于可选从句总数减2.
百分比75%设置最少匹配可选从句的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的默认值是100%,即必须匹配所有从句。

pf(Phrase Fields)

通过fqqf参数确定匹配文档后,可以通过pf参数提高q参数中的所有检索词出现更加集中的文档分值。
使用格式与qf参数格式相同:列出字段并修改每个字段的打分。

ps (Phrase Slop)

ps指定一定数量的”phrase slop”,用于pf参数指定的查询。”Phrase slop”是一个标志位需要移动多少距离到另外一个标志位的距离,用于匹配查询中指定的短语。

qs (Query Phrase Slop)

qs是在用qf参数定义的用户查询中指定明确指定短语查询中”slop”的数量。如上面所说,”Phrase slop”是一个标志位需要移动多少距离到另外一个标志位的距离,用于匹配查询中指定的短语。

tie (Tie Breaker)

tie指定一个在DisMax查询中用来作为”tiebreaker”的浮点数(小于1)。
根据用户输入的检索词匹配多个字段,多于一个字段匹配重构。如果是遮阳,每个字段将根据他在这个字段的出现次数有不同的分值(相对于所有其他文件的每个文件)。tie参数可以让你控制查询分值,来影响低分字段与高分字段。
数值”0.0”使查询成为”disjunction max query”,就是说,只有最高得分子查询影响最终得分。数值”1.0”使查询成为”disjunction sum query”,就是说,最大分子查询没有影响,最后的得分根据子查询的得分和来起作用。通常比较低的分作用最好,比如0.1。

bq (Boost Query)

bq可以指定一个影响用户主查询分值的额外、可选的查询从句。比如,如果你想查询最新的文档:

q=cheese
bq=date:[NOW/DAY-1YEAR TO NOW/DAY]

你可以指定一系列的bq参数。如果你希望你的查询被解析成独立的查询从句,可以使用多个bq参数。

bf (Boost Functions)

bf参数指定将被用于构建将被添加到用户朱查询作为可选重聚影响分值的FunctionQueries的功能(带来可选的加权)。任何Solr内部函数都可以使用。比如:recip(rord(myfield),1,2,3)^1.5
bf参数功能本质上是bq参数混合{!func}解析器的简写。
比如,如果你想展示最先的文件,可以使用下面两种方式中的任何一个:

bf=recip(rord(creationDate),1,1000,1000)
  ...or...
bq={!func}recip(rord(creationDate),1,1000,1000)

示例

使用普通查询请求器,查询指定查询字段,查询单词”video”:

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

DisMax查询被设计为在文本、特征、名称、SKU、编号、manu和字段中获得更好的匹配,匹配名称、或字段的文档得分更高。

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

另外一个示例是指定qt参数是”instock”,稍有不同的配置选项,尤其当设置过滤器是inStock:true的。

http://localhost:8983/solr/techproducts/select?defType=dismax&q=video&fl=name,score,inStock
http://localhost:8983/solr/techproducts/select?defType=dismax&q=video&qt=instock&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

就像标准查询器一样,支持查看解析查询调试数据选项,并解释每个文档的得分。

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

原文链接:The DisMax Query Parser
翻译:沉潜飞动
译文链接:DisMax查询解析器