DisMax扩展(eDisMax)查询解析器是DisMax查询解析器的升级版。除了支持所有DisMax查询解析器参数外,还扩展了DisMax:

  • 支持完整的Lucene的查询分析器语法。
  • 支持查询,例如AND, OR, NOT, -, 和 +
  • 在Lucene查询语法模式中,把 andor 当做 ANDOR
  • 使用“魔术字段” _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

对于小写的布尔参数,比如andor,应该被转换为等同与ANDOR的操作符。

ps

使用pfpf2pf3字段创建的短语查询的默认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查询解析器