DisMax扩展(eDisMax)查询解析器是DisMax查询解析器的升级版。除了支持所有DisMax查询解析器参数外,还扩展了DisMax:
AND
, OR
, NOT
, -
, 和 +
。and
和 or
当做 AND
和 OR
。_val_
和 _query_
。这些字段在schema.xml
中不存在,但可以用他们来做一些特别的事情(比如使用 _val_
做方法查询,或使用 _query_
做嵌套查询)。如果在候选词或短语查询中使用 _val_
,它将被解析为一个方法。+/-
和 短语查询在这种模式中也可用。+foo
(-foo
)将查询匹配所有文档。除了支持所有DisMax参数,eDisMax还包括一下参数:
主查询中,多值字符串列表解析为分值乘以匹配文档分数。这个参数是eDisMax使用BoostQParserPlugin进行查询的包装。
对于小写的布尔参数,比如and
和or
,应该被转换为等同与AND
和OR
的操作符。
使用pf
、pf2
、pf3
字段创建的短语查询的默认slop数量。
基于词对的带有可选权重的字段列表。
与ps
类似,覆盖pf2
定义的slop。如果未指定,则使用ps
。
基于三组词的带有可选权重的字段列表,类似于pf
,不是输入的每个词的每个字段这里一个查询短语,而是每个字段设置一组短语。
与ps
类似,覆盖pf3
定义的slop。如果未指定,则使用ps
。
这个参数是布尔参数,用于指示解析查询时,是否应该使用在查询分析器中定义的StopFilterFactory。如果是false,查询分析器中定义的StopFilterFactory将被忽略。
指明终端用户定义的字段可以显示查询。该参数支持通配符。默认运行所有字段,等同于uf=*
。如果只允许title字段,使用uf=title
。运行title字段和其他以_s
皆为的字段,使用uf=title,*_s
。允许除了title外的所有字段,使用uf=*-title
。不允许所有字段,使用uf=-*
。
通过qf
参数覆盖的各个字段可以根据字段名指定1个或多个别名。默认情况下,在查询字符串中指定的字段名被视为索引中的文本字段名,不使用别名和字段名。
本章例子中所有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”对象级别上,负查询加权已经被支持很长一段时间了。限制查询分析器也对这个功能进行了升级。
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_
,将被解析为函数。_val_:myfield
_val_:"recip(rord(myfield),1,2,3)"
_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查询解析器