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

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章