君子博学而日参省乎己 则知明而行无过矣

博客园 首页 新随笔 联系 订阅 管理

转载 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了,之后有其它的需求也可以通过定制这个类来实现了。

posted on 2012-07-28 20:54  刺猬的温驯  阅读(1412)  评论(0编辑  收藏  举报