转载 http://www.colorfuldays.org/program/solr/solr%E6%89%A9%E5%B1%95dismaxqparser/
最近产品的同事反应给我一个搜索的问题,用户在输入如“QueryParser定制”时搜索不到结果,而搜索“QueryParser 定制”,就能找到正确的结果。这个问题导致搜索无结果率偏高。前天开始致力于解决该问题,经过两天的研究,最终通过定制QueryParser解决该问题。这个问题的解决方案是定制了Solr的QueryParser,下面讲一下如何定制Solr的QueryParser。
我们的搜索引擎使用的是edismax类型,因为一些业务需要用到了edismax提供的特性,因此只能在edismax上做定制。
先做了一下分词测试,“QueryParser定制”与“QueryParser 定制”的分词结果一致。
打开debugQuery,对比“QueryParser定制”与“QueryParser 定制” 输出queryString却不相同。
“QueryParser 定制”显示如下:
“parsedquery”:”+((DisjunctionMaxQuery((goods_title:queryparser))
DisjunctionMaxQuery((goods_title:定制)))~2)”,
“QueryParser定制”则如下:
“parsedquery”:”+DisjunctionMaxQuery((goods_title:\”queryparser 定制\”))”,
从上面两个结果可以看到,分词虽然正确了,但是Edismax的处理方式并不符合预期,只能通过修改源码解决。
找到对应的代码ExtendedDismaxQParserPlugin.java,通过debug研究一下流程后,马上找到要在哪修改了。
修改好源码之后,把这个类放打成lib,部署方式如下:
1、将打好包的放到${solr.home}/lib下,保证Solr在启动时参加载到这个jar。
2、修改solrconfig.xml下面的配置:
添加新的queryParser:
<queryParser name=”newdismax” class=”com.server.solr.NewExtendedDismaxQParserPlugin”/>
使用新的queryParser:
<requestHandler name="/browse" class="solr.SearchHandler"> <lst name="defaults"> <str name="echoParams">explicit</str> <str name="wt">json</str> <str name="json.ml">map</str> <str name="defType">newdismax</str> <str name="rows">20</str> <str name="mm">1</str> <lst> </requestHandler>
需要注意的是NewExtendedDismaxQParserPlugin中的NAME需要改为配置的newdismax。如下:
public static final String NAME = “newedismax”;
重启Solr后,即可使用该新的QueryParser了,之后有其它的需求也可以通过定制这个类来实现了。