zoukankan      html  css  js  c++  java
  • 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了,之后有其它的需求也可以通过定制这个类来实现了。

  • 相关阅读:
    php 计算概率,可以任意添加
    如何绕过浏览器的弹窗拦截机制
    javascript iframe 操作(一)
    视频学习站
    技术博文
    js如何打印对象
    云主机
    cookie小细节
    cookie细节
    实用网址
  • 原文地址:https://www.cnblogs.com/chenying99/p/2613537.html
Copyright © 2011-2022 走看看