solr 自定义 dismax查询方式

1、在solrconfig.xml中增加

Xml代码    收藏代码
  1. <queryParser name="imdismax"  
  2.         class="com.szhtp.search.parse.IMDisMaxQParserPlugin" />  
  3. <requestHandler name="imdismax" class="solr.SearchHandler">  
  4.         <lst name="defaults">  
  5.             <str name="defType">imdismax</str>  
  6.   
  7.             <!-- 查询关键字和设置权重 -->  
  8.             <str name="qf">keywords^3 question^2 answer^0.4</str>  
  9.   
  10.             <str name="pf">keywords^3 question^2 answer^0.4</str>  
  11.   
  12.             <str name="mm">2&lt;-1 5&lt;-2 6&lt;90%</str>  
  13.   
  14.             <!-- 输出时显示那些字段 -->  
  15.             <str name="fl">id,answer,score</str>  
  16.   
  17.             <!-- 设置PhraseSlop的坡度 -->  
  18.             <int name="ps">100</int>  
  19.   
  20.             <str name="hl.fl">answer</str>  
  21.   
  22.             <!-- 默认查询语句用于容错处理 -->  
  23.             <str name="q.alt">*:*</str>  
  24.   
  25.             <!-- 每个snippet返回的最大字符数。默认是100.如果为0,那么该字段不会被fragmented且整个字段的值会被返回。大字段时不会这么做。  
  26.             这里的answer=<str name="hl.fl">answer</str>  
  27.               -->  
  28.             <str name="f.answer.hl.fragsize">50</str>  
  29.   
  30.             <!-- instructs Solr to return the field itself if no query terms are  
  31.                 found -->  
  32.             <!-- 如果没有生成snippet(没有terms 匹配),那么使用另一个字段值作为返回 -->  
  33.             <str name="f.answer.hl.alternateField">answer</str>  
  34.   
  35.             <!-- 这个是solr制定fragment算法的扩展点。gap是默认值。  
  36.                 regex是另一种选项,这种选项指明highlight的边界由一个正则表达式确定。  
  37.                 这是一种非典型的高级选项。为了知道默认设置和fragmenters (and formatters)是如何配置的,  
  38.                 可以看看solrconfig.xml中的highlight段 -->  
  39.             <str name="f.answer.hl.fragmenter">regex</str>  
  40.   
  41.             <str name="tie">0.1</str>  
  42.         </lst>  
  43.     </requestHandler>  

 

2、创建类IMDisMaxQParserPlugin.java

Java代码    收藏代码
  1. public class IMDisMaxQParserPlugin extends QParserPlugin  
  2. {  
  3.     public static String NAME = "imdismax";  
  4.   
  5.     public void init(NamedList args) {  
  6.     }  
  7.   
  8.     public QParser createParser(String qstr, SolrParams localParams, SolrParams params, SolrQueryRequest req) {  
  9.       return new IMDisMaxQParser(qstr, localParams, params, req);  
  10.     }  
  11. }  

 

3、创建类IMDisMaxQParser.java 可以在里面增加中文分词

Java代码    收藏代码
  1. public class IMDisMaxQParser extends DisMaxQParser  
  2. {  
  3.     public IMDisMaxQParser(String qstr, SolrParams localParams,  
  4.             SolrParams params, SolrQueryRequest req)  
  5.     {  
  6.         super(qstr, localParams, params, req);  
  7.   
  8.         if (null == this.qstr)  
  9.         {  
  10.             return;  
  11.         }  
  12.   
  13.         Analyzer analyzer = req.getSchema().getQueryAnalyzer();  
  14.   
  15.         if (null == analyzer)  
  16.         {  
  17.             return;  
  18.         }  
  19.   
  20.         StringBuilder norm = new StringBuilder();  
  21.         try  
  22.         {  
  23. //对question分词  
  24.             TokenStream tokens = analyzer.reusableTokenStream("question",  
  25.                     new StringReader(this.qstr));  
  26.             tokens.reset();  
  27.             Token token = tokens.next();  
  28.             while (token != null)  
  29.             {  
  30.                 norm.append(  
  31.                         new String(token.termBuffer(), 0, token.termLength()))  
  32.                         .append(" ");  
  33.                 token = tokens.next();  
  34.             }  
  35.         }  
  36.         catch (Exception ex)  
  37.         {  
  38.                     }  
  39.         if (norm.length() > 0)  
  40.             this.qstr = norm.toString();  
  41.     }  
  42. }  

你可能感兴趣的:(Solr)