设为首页 收藏本站
查看: 1002|回复: 0

[经验分享] solr 搜索短语搜索不出来的解决方案

[复制链接]

尚未签到

发表于 2016-12-16 09:33:01 | 显示全部楼层 |阅读模式
先是费话,说过要经常写博客的就要坚持。

    最近学习solr,很好很强大。只是学习时间太短,很多没看明白,搭建好环境后,做好主从分布,并能做分布式搜索后,发现一个很严重的问题。就是在搜索短语时,结果很不理想。比如说
我搜“要加油呀”总是搜索不到结果,按理说是应能搜索到保护“加油”的doc才对的,使用debugQuery=on(http://localhost:8080/solr_slave1/select?q=%E8%A6%81%E5%8A%A0%E6%B2%B9&pf=f_contentt&debugQuery=on)查看只是看到了

<lst name="debug">
<str name="rawquerystring">要加油</str>
<str name="querystring">要加油</str>
<str name="parsedquery">PhraseQuery(f_content:"要 加油")</str>
<str name="parsedquery_toString">f_content:"要 加油"</str>
<lst name="explain"/>
<str name="QParser">LuceneQParser</str>

    从上面可以看出分词是分对了,只是将“要加油”转成了“要 加油”,并且solr的处理方式也算是合情合理,将“要加油”分成“要”和“加油”的短语,然后查询索引中保护了这个短语的doc,只要在一个doc中的索引字段中包含了这个词就能搜索出来,当然这中间需要设置一些参数来让solr知道他们之间差多个slop也能知道。但我们想要的分词查询应该是这样的,http://localhost:8080/solr_slave1/select?q=%E8%A6%81%20%E5%8A%A0%E6%B2%B9&debugQuery=on。
<str name="rawquerystring">要 加油</str>
<str name="querystring">要 加油</str>
<str name="parsedquery">f_content:要 f_content:加油</str>
<str name="parsedquery_toString">f_content:要 f_content:加油</str>

   因为研究solr时间不长,暂无解决方案,在网上搜了一下。说实话,网上关于solr的中文文档还真不多,很多都是简单的copy,而且没有深度的东西。

   最后从http://blog.chenlb.com/2010/08/solr-use-custom-query-parser.html 这篇博客看出了端倪。这个作者在开源搜索引擎方面还是挺有见解的。
   
   主要的解决方案就是说将PhraseQuery改为BooleanQuery,并且根据当前默然的operation来进行连接。
   
   要实现这个功能需要重写SolrQueryParser的getFieldQuery方法。为什么?上面已经说过了。因为solr的默认处理方式是将你要搜索的短语能分词分成多个同一个位置的term时会采用BooleanQuery,其他的情况大都按照MultiPhraseQuery来处理,它会将分出的词都放入到这个MultiPhraseQuery中,只有同时满足这个MultiPhraseQuery要求的索引才能被搜索出来,具体可以详看代码QueryParse.java 中第568行protected Query getFieldQuery(String field, String queryText, boolean quoted)  throws ParseException。很显然,我们中文的习惯一般情况下不能匹配这么精确,所以要采用BooleanQuery将能分割出来的词用OR的形式来处理,只要能搜索到部分,这个Doc就显示出来,这样才能得到我们想要的结果。
  
   在结合着他的代码的同时,我稍作了修改。最终算是解决了这个问题。
   
   具体步骤为
     1.继承并实现QParserPlugin中的createParser方法来调用自己的lucene查询分析器。在这个插件中要是用自己的查询分析器。这个插件是要在solrconfig中使用的。
     2.继承并重写QParser中的parse方法,来调用自己的Solr分析器。
     3.继承并重写SolrQueryParser中的getFieldQuery方法,按照自己的思路来让solr处理分词方式。
     4.将自己扩展的代码打成jar包。下面方式可以二选一。
        1)修改solrconfig.xml中的<requestHandler name="search" class="solr.SearchHandler" default="true">。这个是solr服务器默然的请求处理器。
        在<str name="echoParams">explicit</str>下面添加
        <str name="defType">extlucene</str>
       当然extlucene也需要在这个配置文件中声明。
          <queryParser name="extlucene" class="com.sfbuy.solr.search.ExtLuceneQParserPlugin"/>
        2) 直接使用request参数的形式,将http://localhost:8080/select?q=test&defType=extLucene&.........
      
       详细可参照代码

运维网声明 1、欢迎大家加入本站运维交流群:群②:261659950 群⑤:202807635 群⑦870801961 群⑧679858003
2、本站所有主题由该帖子作者发表,该帖子作者与运维网享有帖子相关版权
3、所有作品的著作权均归原作者享有,请您和我们一样尊重他人的著作权等合法权益。如果您对作品感到满意,请购买正版
4、禁止制作、复制、发布和传播具有反动、淫秽、色情、暴力、凶杀等内容的信息,一经发现立即删除。若您因此触犯法律,一切后果自负,我们对此不承担任何责任
5、所有资源均系网友上传或者通过网络收集,我们仅提供一个展示、介绍、观摩学习的平台,我们不对其内容的准确性、可靠性、正当性、安全性、合法性等负责,亦不承担任何法律责任
6、所有作品仅供您个人学习、研究或欣赏,不得用于商业或者其他用途,否则,一切后果均由您自己承担,我们对此不承担任何法律责任
7、如涉及侵犯版权等问题,请您及时通知我们,我们将立即采取措施予以解决
8、联系人Email:admin@iyunv.com 网址:www.yunweiku.com

所有资源均系网友上传或者通过网络收集,我们仅提供一个展示、介绍、观摩学习的平台,我们不对其承担任何法律责任,如涉及侵犯版权等问题,请您及时通知我们,我们将立即处理,联系人Email:kefu@iyunv.com,QQ:1061981298 本贴地址:https://www.yunweiku.com/thread-314996-1-1.html 上篇帖子: 基于Solr的地理位置搜索(2) 下篇帖子: solr 3.4解析xlsx文件报错的解决办法
您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

扫码加入运维网微信交流群X

扫码加入运维网微信交流群

扫描二维码加入运维网微信交流群,最新一手资源尽在官方微信交流群!快快加入我们吧...

扫描微信二维码查看详情

客服E-mail:kefu@iyunv.com 客服QQ:1061981298


QQ群⑦:运维网交流群⑦ QQ群⑧:运维网交流群⑧ k8s群:运维网kubernetes交流群


提醒:禁止发布任何违反国家法律、法规的言论与图片等内容;本站内容均来自个人观点与网络等信息,非本站认同之观点.


本站大部分资源是网友从网上搜集分享而来,其版权均归原作者及其网站所有,我们尊重他人的合法权益,如有内容侵犯您的合法权益,请及时与我们联系进行核实删除!



合作伙伴: 青云cloud

快速回复 返回顶部 返回列表