通过对QParser类的继承 实现SOLR 半匹配检索(模糊搜索/模糊检索) (一)

2019-03-27 01:01|来源: 网路

在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


转自:http://www.cnblogs.com/wycg1984/archive/2010/03/09/1681335

相关问答

更多
  • Solr 是一个可供企业使用的、基于 Lucene 的开箱即用的搜索服务器。对Lucene不熟?那么建议先看看下面两篇文档:   实战Lucene,第 1 部分: 初识 Lucene: http://www.ibm.com/developerworks/cn/java/j-lo-lucene1/   用Lucene加速Web搜索应用程序的开发: http://www.ibm.com/developerworks/cn/web/wa-lucene2/   一、 solr介绍   solr是基于Lucene J ...
  • 由于默认查询处理程序工作(/ select),我开始认为我的查询处理程序有问题。 为了找出问题所在,我开始禁用部分自己的请求处理程序。 空mm可以给你错误 ! 我曾经有一个mm参数,但我不再需要它了,所以我把它留空了...... Since the default query handler worked(/select) I started to think something was wrong with my query handler. ...
  • 我联系了Adobe,并且(令人惊讶地)得到了一些帮助。 他们说ColdFusion正式不支持非ColdFusion Solr服务器。 最后,我们刚刚安装了包含ColdFusion的Solr服务器(当然,通过重新安装ColdFusion)。 另外,他们说ColdFusion附带的Solr服务器是3.4.x版本。 ColdFusion独立Solr服务器版本相同。 我们可能已经安装了CF独立服务器,但为了简单起见选择了本地服务器(经过我们已经遇到的所有麻烦)。 作为旁注,可以使用与ColdFusion不同的Sol ...
  • 如果要查找自定义字符映射规则,可以使用MappingCharFilterFactory ,它将带有规则的配置文件。 Techproducts示例模式展示了它(注释掉,因此在第一次修改后退出)。 检查映射-FoldToASCII.txt和mapping-ISOLatin1Accent.txt If you are looking for custom character mapping rules, you can use MappingCharFilterFactory, which takes a con ...
  • 回答我自己的问题! :) 基本上,为了实现我的目标,我需要做以下事情: 在我的Maven POM文件中包含Solr WAR作为依赖项 将默认的Solr核心和配置( example/collection1/ )解压缩到我项目的子目录(我使用了cores/collection1 ) 在launch -Dsolr.solr.home上添加Java VM参数以指向cores目录( -Dsolr.solr.home=/path/to/my/project/cores ) 它不完全是自包含的(我仍然需要指向一个配置), ...
  • ES已经为此进行了渗透 - 对于Solr,您通常会将文档索引为基于内存的核心/索引中的单个文档,然后针对该文档运行查询(这是ES至少在内部执行的操作,IIRC)。 ES has percolate for this - for Solr you'll usually index the document as a single document in a memory based core / index and then run the queries against that (which is wha ...
  • Sebastian,我相信这里的问题是Sunspot使用完整的类名和id创建一个Solr主id: def index_id_for(class_name, id) #:nodoc: "#{class_name} #{id}" end 因此,如果您的类被索引为Feedback ,然后再次作为Feedback::Problem Solr将有两个条目,因此在搜索时返回它们。 然后,太阳黑子会尝试将每一个与数据库相匹配,然后将相同的项目拉两次。 当重新索引整个数据库时,将删除每个项目及其当前类的索引 - 这就 ...
  • 您需要使用模糊查询的布尔OR查询来执行具有更高提升的精确匹配的布尔查询,以便精确匹配排名更高。 不要担心solr的双重工作。 它是为非常复杂的Lucene查询树而构建的。 使用查询组合来获得预期的相关性排名是常见的做法。 如果你同意pl。 接受我的回答。 You need to do a boolean query of exact match with higher boost with a Boolean OR query of fuzzy query so that exact matches ran ...
  • 我们可以定制嵌入在Solr中的Lucene吗? 是的,你可以 。 但请记住这一点: Lucene和Solr提交者是全文搜索领域的一些最重要的专家。 他们在这个领域有多年的经验。 如果你认为你可以比他们做得更好,那么继续改变Solr以满足你的需求(它是Apache许可的,所以没有任何商业限制),如果你这样做,试着这样做,以便你以后可以贡献它回到项目,这样每个人都可以受益,项目也会向前发展。 对于绝大多数Solr用户而言,库存产品绰绰有余并满足所有需求。 换句话说,在进入更改代码之前,在邮件列表(stackov ...
  • 如果您使用jetty设置从示例目录运行Solr,它应该按原样运行而不进行任何更改。 但是, 对于多核设置,您需要将jar复制到lib目录中 。 如果检查示例文件夹中的solrconfig,它包括solr单元和提取库的jar。 solrconfig.xml - 取消注释此行以包含所有lib jar - 将jar从这些文件夹复制到多核lib文件夹。 这些罐子用于提取。 (Apache pdfbox,poi,fontbox等)