DisMax查询解析器
DisMax查询解析器设计用于处理用户输入的简单短语(无复杂语法),并根据每个字段的重要性使用不同的权重(升序)在多个字段中搜索单个术语。其他选项允许用户根据特定于每个用例的规则(独立于用户输入)影响分数。
一般来说,与“Lucene”Solr查询解析器的接口相比,DisMax查询解析器的接口更像Google的接口。这种相似性使DisMax成为许多用户应用程序的适当查询解析器。它接受一个简单的语法,很少产生错误消息。
DisMax查询解析器支持非常简化的lucene查询解析器语法子集。在Lucene中,引号可用于对短语进行分组,而+/-可用于表示强制和可选子句。所有其他Lucene查询解析器特殊字符(except AND and OR)都被转义以简化用户体验。DisMax查询解析器负责使用布尔子句从用户的输入中构建一个良好的查询,该布尔子句包含用户指定的多个字段和提升的DisMax查询。cross fields and boosts 它还允许solr管理员提供额外的提升查询、提升函数和过滤查询,以人为地影响所有搜索的结果。这些选项都可以指定为solrconfig.xml文件中请求处理程序的默认参数,也可以在solr查询URL中重写。
Interested in the technical concept behind the DisMax name? DisMax stands for Maximum Disjunction. Here’s a definition of a Maximum Disjunction or "DisMax" query:
一种查询,它生成由其子查询生成的文档的联合,并用任何子查询生成的该文档的最大分数对每个文档进行打分,再加上任何其他匹配子查询的中断增量。
无论您是否记得这一解释,请记住,DisMax查询解析器主要设计为易于使用,并且几乎可以接受任何输入而不返回错误。
除了常见的请求参数、高亮的参数和简单的分面参数外,DisMax查询分析器还支持下面描述的参数。与标准查询解析器一样,DisMax查询解析器允许在solrconfig.xml中指定默认参数值,或者由请求中的查询时进行覆盖。
下面的章节将详细解释这些参数。
q
q参数定义了构成搜索本质的主要“查询”。该参数支持用户提供的原始输入字符串,没有特殊转义。+和-字符被视为术语的“强制(必需)”和“禁止(禁用)”修饰语。以平衡引号字符包装的文本(例如,“San Jose”)被视为短语。任何包含奇数个引号字符的查询的计算结果都像根本没有引号字符一样。
q参数不支持通配符,例如*
q.alt
如果指定了,则q.alt参数在未指定主q参数或该参数为空时定义一个查询(默认情况下,将使用标准查询分析语法对其进行分析)。当您需要像查询这样的查询来匹配所有文档时,q.alt参数就派上用场了(不要忘记该查询的rows=0!)以获取集合范围内的分面计数。
qf (Query Fields)
qf参数引入一个字段列表,每个字段都被分配一个增强因子,以增加或减少该特定字段在查询中的重要性。例如,下面的查询:
qf="fieldOne^2.3 fieldTwo fieldThree^0.4"
将FieldOne的Boost指定为2.3,将FieldTwo保留为默认Boost(因为未指定Boost Factor),而Field3的Boost为0.4。这些增强因素使得fieldOne 的意义比fieldTwo的意义更重要,而fieldTwo的意义又比fieldThree的意义更重要。
mm (Minimum Should Match) 最小应匹配
处理查询时,Lucene/Solr识别三种类型的子句:强制、禁止和“可选”(也称为“应”子句)。默认情况下,q参数中指定的所有单词或短语都将被视为“可选”子句,除非它们前面有“+”或“-”。当处理这些“可选”子句时,mm参数使我们可以说这些子句中的某个最小数目必须匹配。DisMax查询解析器在如何指定最小数目方面提供了很大的灵活性。
下表说明了可以指定mm值的各种方法。
Syntax |
Example |
Description |
正整数 |
3 |
定义必须匹配的子句的最小数目,而不管总共有多少个子句。 |
负整数 |
-2 |
将匹配子句的最小数目设置为可选子句的总数减去该值。 |
百分比 |
75% |
将匹配子句的最小数目设置为可选子句总数的该百分比。根据百分比计算的数字向下取整并用作最小值。 |
负百分比 |
-25% |
指示可选子句总数的百分比可能丢失。从百分比计算出的数字向下取整,然后从总数中减去以确定最小数字。 |
以一个正整数开始,后跟一个>或<符号和另一个值的表达式。 |
3<90% |
定义一个条件表达式,指示如果可选子句的数目等于(或小于)整数,则它们都是必需的,但如果它大于整数,则应用规范。在这个例子中:如果有1到3个子句,它们都是必需的,但是对于4个或更多的子句,只需要90%。 |
涉及>或<符号的多个条件表达式 |
2<-25% 9<-3 |
定义多个条件,每个条件仅对大于其前面条件的数字有效。在左边的示例中,如果有1或2个子句,则两者都是必需的。如果有3-9条,除25%外,其余都是必需的。如果超过9条,除三条外,其余都是必需的。 |
指定mm值时,请记住以下内容:
1)在处理百分比时,可以使用负值在边缘情况下获得不同的行为。75%和-25%在处理4个条款时意味着相同的事情,但在处理5个条款时75%意味着需要3个,但-25%意味着需要4个。
2)If the calculations based on the parameter arguments determine that no optional clauses are needed, the usual rules about Boolean queries still apply at search time. (That is, a Boolean query containing no required clauses must still match at least one optional clause).
3)无论计算结果是多少,SOLR都不会使用大于可选子句数或小于1的值。换句话说,无论计算结果有多低或有多高,所需匹配的最小数目永远不会小于1或大于子句的数目。
4)当在配置了不同查询分析器的多个字段之间进行搜索时,字段之间可选子句的数目可能会有所不同。在这种情况下,mm指定的值适用于可选子句的最大数目。例如,如果查询子句被视为其中一个字段的停止字,则该字段的可选子句数将小于其他字段的可选子句数。如果mm设置为100%,则具有此类stopword子句的查询将不会返回该字段中的匹配项,因为删除的子句不算匹配的。
mm的默认值为0%(所有条款可选),除非q.op被指定为“and”,在这种情况下,mm默认为100%(所有条款都需要)。
pf(短语字段)参数
一旦使用fq和qf参数识别出匹配文档的列表(字段列表),则可以使用pf参数“提高”文档的分数,以防q参数中的所有术语出现在非常接近的情况下。
格式与qf参数使用的格式相同:字段列表和“boots”,在从整个q参数中进行短语查询时与每个字段关联。
ps(短语slop)参数
ps参数指定要应用于使用pf参数指定的查询的“短语slop”量。phrase slop是一个令牌相对于另一个令牌移动的位置数,以便与查询中指定的短语匹配。
qs(查询短语slop)参数
qs参数指定使用qf参数显式包含在用户查询字符串中的短语查询所允许的slop量。如上所述,slop是指一个令牌需要相对于另一个令牌移动的位置数,以匹配查询中指定的短语。
tie领带断路参数
tie参数指定了一个浮点值(应该是小于1的值),以用作DisMax查询中的tiebreaker。当针对多个字段测试来自用户输入的术语时,可能有多个字段匹配。如果是这样的话,每个字段将根据该字段中单词的常见程度(对于每个文档相对于所有其他文档)生成不同的评分。TIE参数允许您控制与最高评分字段相比,较低评分字段的得分将对查询的最终得分产生多大影响。值“0.0”(默认值)使查询成为纯粹的“分离最大查询”:也就是说,只有最大得分子查询才会贡献最终得分。值为“1.0”将使查询成为纯粹的“分离和查询”,因为它与最大得分子查询无关,因为最终得分将是子查询得分的总和。通常,低值(如0.1)是有用的。
bq(boost query)参数
bq参数指定一个附加的、可选的查询子句,该子句将添加到用户的主查询中以影响分数。例如,如果要为最近的文档添加相关性增强:
q=cheese
bq=date:[NOW/DAY-1YEAR TO NOW/DAY]
可以指定多个bq参数。如果希望将查询解析为具有单独升迁的单独子句,请使用多个bq参数。
bf参数指定将用于构造函数查询的函数(带有可选提升),这些函数查询将作为影响分数的可选子句添加到用户的主查询中。可以使用solr本机支持的任何函数以及boost值。例如:
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)
需补充。
https://lucene.apache.org/solr/guide/8_1/the-dismax-query-parser.html#mm-minimum-should-match-parameter