Solr扩展DismaxQParser

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

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值