在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