Solr 6.0 学习(十五)Solr SearchComponent

本文深入探讨了Solr中的查询组件(SearchComponent),包括其源码分析、默认组件介绍及如何自定义查询组件。通过具体实例讲解了FacetComponent的实现方式,并提供了自定义组件的步骤。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

我们看到之前文章Solr 6.0 学习(十四)Solr RequstHandler中的代码,我们看到有如下片段

 if (timer == null) {
            for (final SearchComponent c : components) {
                c.prepare(rb);
            }
        }
        else {
            final RTimerTree subt = timer.sub("prepare");
            for (final SearchComponent c2 : components) {
                rb.setTimer(subt.sub(c2.getName()));
                c2.prepare(rb);
                rb.getTimer().stop();
            }
            subt.stop();
        }

SearchComponent 就是我们本篇文章所要讲的查询组件。

SearchComponent 源码

public abstract class SearchComponent implements SolrInfoMBean, NamedListInitializedPlugin
{
    private String name;
    public static final Map<String, Class<? extends SearchComponent>> standard_components;

    public SearchComponent() {
        this.name = this.getClass().getName();
    }

    /*
       预处理
    */
    public abstract void prepare(final ResponseBuilder p0) throws IOException;
    /*
       执行
    */
    public abstract void process(final ResponseBuilder p0) throws IOException;

    public int distributedProcess(final ResponseBuilder rb) throws IOException {
        return ResponseBuilder.STAGE_DONE;
    }

    public void modifyRequest(final ResponseBuilder rb, final SearchComponent who, final ShardRequest sreq) {
    }

    public void handleResponses(final ResponseBuilder rb, final ShardRequest sreq) {
    }

    public void finishStage(final ResponseBuilder rb) {
    }

    public void setName(final String name) {
        this.name = name;
    }

    @Override
    public void init(final NamedList args) {
    }

    @Override
    public String getName() {
        return this.name;
    }

    @Override
    public abstract String getDescription();

    @Override
    public String getSource() {
        return null;
    }

    @Override
    public String getVersion() {
        return this.getClass().getPackage().getSpecificationVersion();
    }

    @Override
    public Category getCategory() {
        return Category.OTHER;
    }

    @Override
    public URL[] getDocs() {
        return null;
    }

    @Override
    public NamedList getStatistics() {
        return null;
    }

    static {
        final HashMap<String, Class<? extends SearchComponent>> map = new HashMap<String, Class<? extends SearchComponent>>();
        map.put("highlight", HighlightComponent.class);
        map.put("query", QueryComponent.class);
        map.put("facet", FacetComponent.class);
        map.put("facet_module", FacetModule.class);
        map.put("mlt", MoreLikeThisComponent.class);
        map.put("stats", StatsComponent.class);
        map.put("debug", DebugComponent.class);
        map.put("get", RealTimeGetComponent.class);
        map.put("expand", ExpandComponent.class);
        standard_components = Collections.unmodifiableMap((Map<? extends String, ? extends Class<? extends SearchComponent>>)map);
    }
}

solr默认的查询组件

在文章Solr 6.0 学习(十四)Solr RequstHandler中的代码
我们看到如果没有定义查询组件的时候会去加载solr默认的查询组件

/*
     *获取默认查询组件
     */
    protected List<String> getDefaultComponents() {
        final ArrayList<String> names = new ArrayList<String>(8);
        names.add("query");
        names.add("facet");
        names.add("facet_module");
        names.add("mlt");
        names.add("highlight");
        names.add("stats");
        names.add("debug");
        names.add("expand");
        return names;
    }

我们找到FacetComponent,截取部分源码
1、继承SearchComponent

public class FacetComponent extends SearchComponent

2、重写实现prepare和process

@Override
    public void prepare(final ResponseBuilder rb) throws IOException {
        if (rb.req.getParams().getBool("facet", false)) {
            rb.setNeedDocSet(true);
            rb.doFacets = true;
            final ModifiableSolrParams params = new ModifiableSolrParams();
            final SolrParams origParams = rb.req.getParams();
            final Iterator<String> iter = (Iterator<String>)origParams.getParameterNamesIterator();
            while (iter.hasNext()) {
                final String paramName = iter.next();
                if (!paramName.startsWith("facet")) {
                    params.add(paramName, origParams.getParams(paramName));
                }
                else {
                    final HashSet<String> deDupe = new LinkedHashSet<String>(Arrays.asList(origParams.getParams(paramName)));
                    params.add(paramName, (String[])deDupe.toArray(new String[deDupe.size()]));
                }
            }
            rb.req.setParams((SolrParams)params);
            FacetContext.initContext(rb);
        }
    }

    @Override
    public void process(final ResponseBuilder rb) throws IOException {
        if (rb.doFacets) {
            final SolrParams params = rb.req.getParams();
            final SimpleFacets f = new SimpleFacets(rb.req, rb.getResults().docSet, params, rb);
            final NamedList<Object> counts = getFacetCounts(f);
            final String[] pivots = params.getParams("facet.pivot");
            if (!ArrayUtils.isEmpty((Object[])pivots)) {
                final PivotFacetProcessor pivotProcessor = new PivotFacetProcessor(rb.req, rb.getResults().docSet, params, rb);
                final SimpleOrderedMap<List<NamedList<Object>>> v = pivotProcessor.process(pivots);
                if (v != null) {
                    counts.add("facet_pivot", (Object)v);
                }
            }
            rb.rsp.add("facet_counts", counts);
        }
    }

自定义查询组件

1、继承SearchComponent

public class CustomerComponent extends SearchComponent

2、重写实现prepare和process

@Override
 public void prepare(final ResponseBuilder p0) throws IOException{
        //TODO 
    };
     @Override
 public abstract void process(final ResponseBuilder p0) throws IOException{
       //TODO
 }

3、配置查询组件
solrconfig.xml中的配置

<searchComponent name="customer"    class="com.component.CustomerComponent" ></searchComponent>

将查询组件配置到requestHandler下

<requestHandler name="/select" class="solr.SearchHandler">
     <lst name="defaults">
       <str name="echoParams">explicit</str>
       <int name="rows">10</int>
       <str name="df">text</str>
     </lst>
     <arr name="components">
         <str>customer</str>
     </arr>
</requestHandler>
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值