通过对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

 

 

评论 5
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值