solr 自定义 dismax查询方式

    xiaoxiao2023-09-18  172

    1、在solrconfig.xml中增加

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

     

    2、创建类IMDisMaxQParserPlugin.java

    Java代码   public class IMDisMaxQParserPlugin extends QParserPlugin  {      public static String NAME = "imdismax";        public void init(NamedList args) {      }        public QParser createParser(String qstr, SolrParams localParams, SolrParams params, SolrQueryRequest req) {        return new IMDisMaxQParser(qstr, localParams, params, req);      }  }  

     

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

    Java代码   public class IMDisMaxQParser extends DisMaxQParser  {      public IMDisMaxQParser(String qstr, SolrParams localParams,              SolrParams params, SolrQueryRequest req)      {          super(qstr, localParams, params, req);            if (null == this.qstr)          {              return;          }            Analyzer analyzer = req.getSchema().getQueryAnalyzer();            if (null == analyzer)          {              return;          }            StringBuilder norm = new StringBuilder();          try          {  //对question分词              TokenStream tokens = analyzer.reusableTokenStream("question",                      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)          {                      }          if (norm.length() > 0)              this.qstr = norm.toString();      }  }   相关资源:敏捷开发V1.0.pptx
    最新回复(0)