博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
Solr应用扩展queryParser
阅读量:6161 次
发布时间:2019-06-21

本文共 1639 字,大约阅读时间需要 5 分钟。

默认情况下,Solr查询语法只有两种形式:关键词或者以空格分隔的关键词组。当查询英文时,英文本身就是以空格来区分词的,所以Solr就能直接获取英文词并组装Query;但是中文句子中间没有空格,Solr查询时把整个句子交给Query,然后由Query再按照Field来分词、查询。这样就丧失了DisMax中qf所能带来的好处。 


如果能够在用户输入之后,传入DisMax和QueryComponent之前,把中文句子分割为:关键词+空格+关键词,就能享受Solr中的所有好处。分析DisMaxQParserPlugin和DisMaxQParser的实现,在DisMaxQParser中能够获得默认查询字段和分析器,假如默认查询字段是中文类型,那么就可以通过默认字段和分析器对中文句子拆词了。 


具体实现: 


修改solrconfig.xml 


增加一行:<queryParser name="myDisMax" class="my.MyQParserPlugin"/> 


增加类MyQParserPlugin 


public class MyQParserPlugin extends QParserPlugin { 

  public static String NAME = "myDisMax"; 

  public void init(NamedList args) { 

  } 

  public QParser createParser(String qstr, SolrParams localParams, SolrParams params, SolrQueryRequest req) { 

    return new MyQParser(qstr, localParams, params, req); 

  } 



增加类MyQParser 


public class MyQParser extends DisMaxQParser { 

  private static Logger log = LoggerFactory.getLogger(MyQParser.class); 

  public MyQParser(String qstr, SolrParams localParams, SolrParams params, SolrQueryRequest req) { 

    super(qstr, localParams, params, req); 

    Analyzer analyzer = req.getSchema().getQueryAnalyzer(); 

    if(null == analyzer) 

        return; 

    StringBuilder norm = new StringBuilder(); 

log.info("before analyzer, qstr="+this.qstr); 

    try{ 

        TokenStream tokens = analyzer.reusableTokenStream( req.getSchema().getDefaultSearchFieldName(), new StringReader( this.qstr ) ); 

        tokens.reset(); 

        Token token = tokens.next(); 

        while( token != null ) { 

          norm.append( new String(token.termBuffer(), 0, token.termLength()) ).append(" "); 

          token = tokens.next(); 

        } 

    } catch(Exception ex){ 

log.info("Ex="+ex); 

    } 

    if(norm.length() > 0) 

        this.qstr = norm.toString(); 

log.info("after analyzer, qstr="+this.qstr); 

  } 

转载地址:http://smhfa.baihongyu.com/

你可能感兴趣的文章
Response. AppendHeader使用大全及文件下载.net函数使用注意点(转载)
查看>>
jQuery最佳实践
查看>>
centos64i386下apache 403没有权限访问。
查看>>
jquery用法大全
查看>>
PC-BSD 9.2 发布,基于 FreeBSD 9.2
查看>>
css斜线
查看>>
Windows phone 8 学习笔记(3) 通信
查看>>
Revit API找到风管穿过的墙(当前文档和链接文档)
查看>>
Scroll Depth – 衡量页面滚动的 Google 分析插件
查看>>
Windows 8.1 应用再出发 - 视图状态的更新
查看>>
自己制作交叉编译工具链
查看>>
Qt Style Sheet实践(四):行文本编辑框QLineEdit及自动补全
查看>>
[物理学与PDEs]第3章习题1 只有一个非零分量的磁场
查看>>
onInterceptTouchEvent和onTouchEvent调用时序
查看>>
android防止内存溢出浅析
查看>>
4.3.3版本之引擎bug
查看>>
SQL Server表分区详解
查看>>
STM32启动过程--启动文件--分析
查看>>
垂死挣扎还是涅槃重生 -- Delphi XE5 公布会归来感想
查看>>
淘宝的几个架构图
查看>>