solr4.7.2自定义查询分析器

默认查询分析器

  <requestHandler name="/select" class="solr.SearchHandler">
     <lst name="defaults">
       <int name="rows">10</int>
       <str name="defType">lucene</str>            
     </lst>
  </requestHandler>  

defType参数

defType参数选择 Solr 应该用来处理请求中的主查询参数(q)的查询解析器。

defType=lucene

defType=dismax

如果没有指定 defType 参数,则默认使用标准查询解析器(lucene)。

类QParserPlugin

QParserPlugin定义了defType参数的标准插件

LuceneQParserPlugin.class
DisMaxQParserPlugin.class

QParserPlugin相关源码

 /**
   * Internal use - name to class mappings of builtin parsers.
   * Each query parser plugin extending {@link QParserPlugin} has own instance of standardPlugins.
   * This leads to cyclic dependencies of static fields and to case when NAME field is not yet initialized.
   * This result to NPE during initialization.
   * For every plugin, listed here, NAME field has to be final and static.
   */
  public static final Object[] standardPlugins = {
    LuceneQParserPlugin.NAME, LuceneQParserPlugin.class,
    OldLuceneQParserPlugin.NAME, OldLuceneQParserPlugin.class,
    FunctionQParserPlugin.NAME, FunctionQParserPlugin.class,
    PrefixQParserPlugin.NAME, PrefixQParserPlugin.class,
    BoostQParserPlugin.NAME, BoostQParserPlugin.class,
    DisMaxQParserPlugin.NAME, DisMaxQParserPlugin.class,
    ExtendedDismaxQParserPlugin.NAME, ExtendedDismaxQParserPlugin.class,
    FieldQParserPlugin.NAME, FieldQParserPlugin.class,
    RawQParserPlugin.NAME, RawQParserPlugin.class,
    TermQParserPlugin.NAME, TermQParserPlugin.class,
    NestedQParserPlugin.NAME, NestedQParserPlugin.class,
    FunctionRangeQParserPlugin.NAME, FunctionRangeQParserPlugin.class,
    SpatialFilterQParserPlugin.NAME, SpatialFilterQParserPlugin.class,
    SpatialBoxQParserPlugin.NAME, SpatialBoxQParserPlugin.class,
    JoinQParserPlugin.NAME, JoinQParserPlugin.class,
    SurroundQParserPlugin.NAME, SurroundQParserPlugin.class,
    SwitchQParserPlugin.NAME, SwitchQParserPlugin.class,
    MaxScoreQParserPlugin.NAME, MaxScoreQParserPlugin.class,
    BlockJoinParentQParserPlugin.NAME, BlockJoinParentQParserPlugin.class,
    BlockJoinChildQParserPlugin.NAME, BlockJoinChildQParserPlugin.class,
    CollapsingQParserPlugin.NAME, CollapsingQParserPlugin.class,
    SimpleQParserPlugin.NAME, SimpleQParserPlugin.class
  };

LuceneQParserPlugin.class和DisMaxQParserPlugin.class相关源码

public class LuceneQParserPlugin extends QParserPlugin {
  public static final String NAME = "lucene";

  @Override
  public void init(NamedList args) {
  }

  @Override
  public QParser createParser(String qstr, SolrParams localParams, SolrParams params, SolrQueryRequest req) {
    return new LuceneQParser(qstr, localParams, params, req);
  }
}

public class DisMaxQParserPlugin extends QParserPlugin {
  public static final String NAME = "dismax";

  @Override
  public void init(NamedList args) {
  }

  @Override
  public QParser createParser(String qstr, SolrParams localParams, SolrParams params, SolrQueryRequest req) {
    return new DisMaxQParser(qstr, localParams, params, req);
  }
}

可见编写自定义查询分析器要继承QParserPlugin类

编写自定义查询分析器

模仿LuceneQParserPlugin.class写个测试用,和LuceneQParserPlugin.class的查询解析功能一致

public class MyLuceneQParserPlugin extends QParserPlugin {
    public static final String NAME = "mylucene";

    @Override
    public void init(NamedList args) {
    }

    @Override
    public QParser createParser(String qstr, SolrParams localParams, SolrParams params, SolrQueryRequest req) {
        return new MyLuceneQParser(qstr, localParams, params, req);
    }

    class MyLuceneQParser extends QParser {
        SolrQueryParser lparser;

        public MyLuceneQParser(String qstr, SolrParams localParams, SolrParams params, SolrQueryRequest req) {
            super(qstr, localParams, params, req);
        }


        @Override
        public Query parse() throws SyntaxError {
            String qstr = getString();
            if (qstr == null || qstr.length()==0) return null;
            String defaultField = getParam(CommonParams.DF);
            if (defaultField==null) {
                defaultField = getReq().getSchema().getDefaultSearchFieldName();
            }

            lparser = new SolrQueryParser(this, defaultField);
            lparser.setDefaultOperator
                    (QueryParsing.getQueryParserDefaultOperator(getReq().getSchema(),
                            getParam(QueryParsing.OP)));
            return lparser.parse(qstr);
        }


        @Override
        public String[] getDefaultHighlightFields() {
            return lparser == null ? new String[]{} : new String[]{lparser.getDefaultField()};
        }
    }
}

solrconfig.xml

<?xml version="1.0" encoding="UTF-8" ?>
<config>

<queryParser name="mylucene" class="cn.chy.plugin.MyLuceneQParserPlugin" />

....省略....

<requestHandler name="/myquery" class="solr.SearchHandler" default="true">
    <lst name="defaults">
    <str name="defType">mylucene</str>  
    <str name="echoParams">explicit</str>
    <int name="rows">10</int>
    </lst>
</requestHandler>

</config>

lib目录

solr默认加载core目录中lib目录中的jar包,将jar包放到lib目录即可

solr查询

http://localhost:8892/solr/testindex_shard3_replica1/myquery?q=sdes%3A%E7%BE%8E%E4%B8%BD&wt=json&indent=true

solr admin

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值