DisMax扩展(eDisMax)查询解析器是DisMax查询解析器的升级版。除了支持所有DisMax查询解析器参数外,还扩展了DisMax:
- 支持完整的Lucene的查询分析器语法。
- 支持查询,例如
AND
,OR
,NOT
,-
, 和+
。 - 在Lucene查询语法模式中,把
and
和or
当做AND
和OR
。 - 使用“魔术字段”
_val_
和_query_
。这些字段在schema.xml
中不存在,但可以用他们来做一些特别的事情(比如使用_val_
做方法查询,或使用_query_
做嵌套查询)。如果在候选词或短语查询中使用_val_
,它将被解析为一个方法。 - 在语法错误的情况下,包括改进的智能部分逃逸;字段查询、
+/-
和 短语查询在这种模式中也可用。 - 使用word shingles改进接近加权;您不需要查询来匹配文档中的所有单词,在接近提高之前应用。在接近加权提供前,你不需要查询匹配所有单词。
- 包括先进的停用词处理:停用词不是查询必需部分,但却在接近加权部分中使用。如果查询包含所有停用词,比如”to be or not to be”,则所有词都必须存在。
- 包括改进的加权方法:在eDisMax中,加权方法是乘数而不是加数,改善加权效果;DisMax中的加和的加权(bf和bq)也同样支持。
- 支持纯消极嵌套查询:查询如
+foo
(-foo
)将查询匹配所有文档。 - 可以指定终端用户可以查询哪些字段,和禁止直接指派搜索。
扩展DisMax参数
除了支持所有DisMax参数,eDisMax还包括一下参数:
boost
主查询中,多值字符串列表解析为分值乘以匹配文档分数。这个参数是eDisMax使用BoostQParserPlugin进行查询的包装。
lowercaseOperators
对于小写的布尔参数,比如and
和or
,应该被转换为等同与AND
和OR
的操作符。
ps
使用pf
、pf2
、pf3
字段创建的短语查询的默认slop数量。
pf2
基于词对的带有可选权重的字段列表。
ps2
与ps
类似,覆盖pf2
定义的slop。如果未指定,则使用ps
。
pf3
基于三组词的带有可选权重的字段列表,类似于pf
,不是输入的每个词的每个字段这里一个查询短语,而是每个字段设置一组短语。
ps3
与ps
类似,覆盖pf3
定义的slop。如果未指定,则使用ps
。
stopwords
这个参数是布尔参数,用于指示解析查询时,是否应该使用在查询分析器中定义的StopFilterFactory。如果是false,查询分析器中定义的StopFilterFactory将被忽略。
uf
指明终端用户定义的字段可以显示查询。该参数支持通配符。默认运行所有字段,等同于uf=*
。如果只允许title字段,使用uf=title
。运行title字段和其他以_s
皆为的字段,使用uf=title,*_s
。允许除了title外的所有字段,使用uf=*-title
。不允许所有字段,使用uf=-*
。
使用per-field qf 覆盖字段别名
通过qf
参数覆盖的各个字段可以根据字段名指定1个或多个别名。默认情况下,在查询字符串中指定的字段名被视为索引中的文本字段名,不使用别名和字段名。
eDisMax示例
本章例子中所有URL都是使用techproducts
实例,使用命令bin/solr -e techproducts
启动。
根据文档中的popularity
进行结果加权的检索词是”hello“的查询:http://localhost:8983/solr/techproducts/select?defType=edismax&q=hello&pf=text&qf=text&boost=popularity
查询“iPods”或“video”:http://localhost:8983/solr/techproducts/select?defType=edismax&q=ipod+OR+video
跨字段查询,指定(通过加权)每个字段彼此间的重要性:http://localhost:8983/solr/techproducts/select?q=video&defType=edismax&qf=features^20.0+text^0.3
对匹配结果中的某个字段是指定值的结果加权:http://localhost:8983/solr/techproducts/select?q=video&defType=edismax&qf=features^20.0+text^0.3&bq=cat:electronics^5.0
使用mm
参数,1或2个检索词时,需要全部匹配,3个以上,可以允许有一个不匹配:
http://localhost:8983/solr/techproducts/select?q=belkin+ipod&defType=edismax&mm=2
http://localhost:8983/solr/techproducts/select?q=belkin+ipod+gibberish&defType=edismax&mm=2
http://localhost:8983/solr/techproducts/select?q=belkin+ipod+apple&defType=edismax&mm=2
In the example below, we see a per-field override of the qf parameter being used to alias “name” in the query string to either the “last_name” and “first_name” fields:
defType=edismax
q=sysadmin name:Mike
qf=title text last_name first_name
f.name.qf=last_name first_name
使用负加权
在“Query”对象级别上,负查询加权已经被支持很长一段时间了。限制查询分析器也对这个功能进行了升级。
使用slop
DisM和eDis可以针对所有查询字段进行查询,也可以执行短语查询。然而,短语查询可以包含一个slop,即检索词之间的允许的距离。比如:
q=foo bar
qf=field1^5 field2^10
pf=field1^50 field2^20
defType=dismax
对于上面的参数,DisMax查询解析器解析为:(+(field1:foo^5 OR field2:bar^10) AND (field1:bar^5 OR field2:bar^10))
。
但也可以解析为:field1:"foo bar"^50 OR field2:"foo bar"^20
。
因此,任何包含“foo”和“bar”的文档都将匹配;但那些包含两个检索词作为短语的文档,将获取更高分值,因为它们相关性更高。
如果你增加ps
参数,第二个查询将被替换为:ps=10 field1:"foo bar"~10^50 OR field2:"foo bar"~10^20
。
这就意味着,如果文档中“foo”与“bar”之间少于10个短语,该文档将匹配成功。比如:*Foo* term1 term2 term3 *bar*
将被匹配成功。
如何使用短语slop呢?通常它们被定义在请求操作器中。
这个qs
的概念是相似的,它适用于明确短语查询用户。比如,你想查询一个名字,你可以键入:q="Hans Anderson"
。
文件中包含”Hans Anderson”的将被匹配,但文档中包含中名”Christian”的或名字倒着写做”Anderson, Hans”将不会匹配。这些情况下,可以配置qs
,所以即使用户搜索一个明确的短语搜索,也可以使用slop。
最后,eDisMax不仅包括pf
参数,也包括短语查询字段2和3。你可以使用这些字段来设置不同的字段或加权。可以每个使用不同的slop。
使用魔法字段_val_
和_query_
如果在一个查询中使用魔法字段_val_
,将被解析为函数。
Solr查询解析器中对于_val_
和_query_
的使用在以下几个方面不同于Lucene查询解析器:
- 如果在一个查询中使用魔法字段
_val_
,将被解析为函数。 - 提供了FunctionQuery语法钩子。当包含圆括号时,需要使用引号。例如:
_val_:myfield _val_:"recip(rord(myfield),1,2,3)"
- Solr查询解析器提供支持任何查询解析器(使用QParserPlugin)的嵌套查询。如果包含保留字,需要使用引号来封装嵌套查询。比如:
_query_:"{!dismax qf=myfield}how now brown cow"
虽然不是特别的语法差异,如果你使用Solr的TrieDateField类型(或已经过时的DateField类型),在这些字段上的查询(一般范围查询)应该使用严格的ISO 8601日期语法,或者DateMath语法来获取数据。比如:
timestamp:[* TO NOW]
createdate:[1976-03-06T23:59:59.999Z TO *]
createdate:[1995-12-31T23:59:59.999Z TO 2007-03-06T00:00:00Z]
pubdate:[NOW-1YEAR/DAY TO NOW/DAY+1DAY]
createdate:[1976-03-06T23:59:59.999Z TO 1976-03-06T23:59:59.999Z+1YEAR]
createdate:[1976-03-06T23:59:59.999Z/YEAR TO 1976-03-06T23:59:59.999Z]
注:
必须使用大写,否则Solr将抛出’Range Group’错误。
原文链接:The Extended DisMax Query Parser
翻译:沉潜飞动
译文链接:eDisMax查询解析器