Solr 6.6.2中eDisMax查询不遵循mm参数问题求助
Solr 6.6.2 eDisMax vs DisMax mm参数行为差异问题解答
这个问题的核心原因其实是DisMax和eDisMax对q参数的默认运算符处理不同,并不是Bug,而是两者的设计差异容易被忽略:
- DisMax的默认
q.op是OR,所以当你传入q=samsung iphone时,Solr会解析为samsung OR iphone,配合mm=1(至少匹配1个词),自然能返回包含任意一个关键词的文档。 - eDisMax的默认
q.op是AND,此时q=samsung iphone会被解析为samsung AND iphone——这时候所有关键词都是必须匹配的子句,mm参数只对should类型的子句生效,所以即使设置了mm=1,也需要文档同时包含两个关键词才会被返回,而你的数据里没有这样的文档,所以返回numFound=0。
解决方法
你可以通过以下两种方式让eDisMax的行为和DisMax一致:
显式设置
q.op=OR
修改后的请求参数如下:defType=edismax&q=samsung+iphone&qf=name+brand&mm=1&q.op=OR这样eDisMax会把
q里的多个关键词解析为OR关系,mm=1的规则就会生效,返回包含任意一个关键词的文档。在
q参数中显式使用OR运算符
直接修改q的值为samsung OR iphone,不需要额外设置q.op:defType=edismax&q=samsung+OR+iphone&qf=name+brand&mm=1
验证建议
你可以通过Solr的查询调试工具(比如Solr Admin的Query页面)开启debugQuery=true参数,查看两种查询的解析后的查询语句,这样能更直观地看到DisMax和eDisMax对q参数的不同处理逻辑。
举个例子,开启调试后,eDisMax默认的查询会显示类似:
+(samsung iphone) +channel:outbound
而加上q.op=OR后,查询会变成:
+(samsung iphone~1) +channel:outbound (这里的~1就是
mm=1的作用,允许至少匹配1个词)
内容的提问来源于stack exchange,提问作者codeCruncher
相关产品推荐
相关产品推荐

