zoukankan      html  css  js  c++  java
  • 通过对QParser类的继承 实现SOLR 半匹配检索(模糊搜索/模糊检索) (一)

    在SOLR应用中,需要支持对指定关键词部分匹配的应用场景

    如何实现SOLR的模糊检索(半匹配)?

    何谓模糊检索(半匹配):

    这种方式是生产环境下经常要使用到的检索方式,通过对命中请求关键词分词后的一个或多个词元的进行检索方式叫做半匹配或模糊匹配,(注意: 这里要与SOLR检索运算符“~” 检索方式区分开)。

    如用户输入关键词:战争人,但是索引库里收录只有“战争之人”,这时如果输入:

    name:战争人,想要在索引库里匹配到“战争之人”是不可行的,SOLR定会返回空结果集。

    一般正常的做法是

    输入:name:战争 OR name:人

    这就是SOLR告诉我们的解决办法。

    看到这里,大家可能就郁闷了,SOLR怎么可能不支持半匹配?用DISMAX啊~~~ ,我也是抱着一线希望查遍了官方WIKI和中英文网站及论坛,也使用了DISMAX的ps(Phrase Slop)参数,但都没有效果。

    实在没办法,就索性啃起了SOLR的源代码,结果发现默认检索没有使用SCHEMA配置文件中用到的分词解析器!!

    最终确定一个方案通过对解析PARSER的改造实现SOLR对中文QUERY自动分词的支持。

    下面就是SOLR v1.4核心源码的简单表示:

    //包名:类名:类下面的方法()下一行触发代码所在行号

    core:SolrCore:execute() 1303

    handler:RequestHandlerBase:handleRequest()  131

    handler:SearchHandler:handleRequestBody()  174

    component:QueryComponent:prepare()  89   

    search:QParser:getQuery() 129

    search:LuceneQParserPlugin:parse()   59

    component:QueryComponent:prepare()  89   

    handler:SearchHandler:handleRequestBody()  195

    component:QueryComponent : process() 

    handler:SearchHandler:handleRequestBody()  195

    handler: RequestHandlerBase:handleRequest()  131

    core:SolrCore:execute() 1317

    servlet:SolrDispatchFilter:doFilter() 246

    servlet:SolrDispatchFilter:writeResponse()     259

  • 相关阅读:
    045_分页查询插件 bootstrap_pagination
    Kali中文乱码问题
    将一行很长的js代码格式化输出方便查看
    使用gcc编译c语言解码ascii码
    Netcat
    阿里云万网注册个人域名并配置解析主机
    使用阿里云服务器配置frp实现Windows系统RDP内网穿透
    mysql数据库行级锁的使用(二)
    关于mysql数据库行级锁的使用(一)
    关于volatile的可见性问题
  • 原文地址:https://www.cnblogs.com/wycg1984/p/1681335.html
Copyright © 2011-2022 走看看