Solr 8.9.0 DisMax查询解析器查询无返回结果问题咨询
问题根因
DisMax查询解析器本身的设计定位是处理无结构的用户自然语言输入,不支持标准查询解析器的字段名:'查询词'这类结构化语法,你写的查询语句从解析阶段就出错了,所以返回0结果:
- 你在q参数里写的
directed_by:'Adam Bhala Lough~',DisMax不会识别directed_by:这个字段前缀,也不会把单引号识别为短语包裹符、把尾部的~识别为模糊匹配符,而是把整串字符当成普通查询文本参与分词,最终根本没有在directed_by字段上做正确匹配。 - 你没有配置
qf(查询字段列表)参数时,DisMax只会在默认配置的查询字段里搜索,完全不会命中directed_by字段的索引。 - 因为查询串解析错误,分词后得到的子句和索引里的词完全对不上,哪怕设了
mm=2也匹配不到任何结果。
你用标准查询解析器能查到结果,就是因为标准解析器能正确识别字段限定、引号、模糊匹配符的语法,和DisMax的解析逻辑完全不同。
可直接用的解决方案
按DisMax的参数规则调整查询语句即可,不要在q参数里写字段前缀和包裹引号,通过独立参数指定查询字段、匹配规则:
curl -G http://localhost:8983/solr/testCore1/select \ --data-urlencode "q=Adam Bhala Lough~1" \ --data-urlencode "defType=dismax" \ --data-urlencode "qf=directed_by" \ --data-urlencode "mm=2"
参数说明:
q=Adam Bhala Lough~1:去掉无效的字段前缀和单引号,给查询词设置1个编辑距离的模糊匹配(默认不带数字的~是2个编辑距离,容易误匹配到Adam Gary Lennon这类不相关结果,设为1刚好兼容名字缺词、少量拼写误差的场景)qf=directed_by:显式指定本次查询只在directed_by字段上匹配mm=2:要求分词后的3个查询词(Adam、Bhala、Lough)至少命中2个,刚好符合你的匹配预期:Adam Bhala:命中Adam、Bhala2个词,满足匹配条件Adam Bhala Lough:3个词全中,满足匹配条件Adam Gary Lennon:仅命中Adam1个词,不满足匹配条件,会被过滤
如果后续需要写更复杂的带字段限定、布尔逻辑的查询,直接把defType=dismax换成defType=edismax即可,扩展DisMax解析器兼容所有DisMax参数,同时支持标准解析器的结构化查询语法,容错性和灵活性都比老版DisMax更好。
内容的提问来源于stack exchange,提问作者user595014
相关产品推荐
相关产品推荐

