`
chenchuan
  • 浏览: 18027 次
  • 性别: Icon_minigender_1
  • 来自: 北京
社区版块
存档分类
最新评论

Solr分析

    博客分类:
  • Solr
阅读更多

  最近一直在研究Solr的相关源代码,今天开始记录!

           1.SolrCore启动

                首先我们看solrcore的核心构造方法,如下:

public SolrCore(String name, String dataDir, SolrConfig config, IndexSchema schema, CoreDescriptor cd, UpdateHandler updateHandler, IndexDeletionPolicyWrapper delPolicy, SolrCore prev)

    整个solrcore的初始化有这个构造方法完成,主要做了如下几件事情:

     1):initDirectoryFactory()通过solrconfig.xml文件中<directoryFactory/>配置初始化directory工厂,如果没有配置默认则采用NRTCachingDirectoryFactory

       2)获取solr索引根目录,配置在solrConfig.xml文件中

       3) initListeners();初始化后监听器newSearcher。firstSearcher

       4)initIndex():初始化Directory(NRTCachingDirectory)和indexfactory,其中对directory进行缓存

       5)initWriters(),initQParsers();initValueSourceParsers(); initTransformerFactories();后续介绍

       6)通过solrConfig文件初始化相关RequestHandler

       7)getSearcher(false, false, null, true)初始化searcher(下面重点分析这个方法)

   在solrcore的构造方法中有如下一段代码

 

// cause the executor to stall so firstSearcher events won't fire
      // until after inform() has been called for all components.
      // searchExecutor must be single-threaded for this to work
      searcherExecutor.submit(new Callable<Void>() {
        
        public Void call() throws Exception {
          latch.await();
          return null;
        }
      });

 这个有一段注解,大概意识是说:阻塞线程池,直到所有的组件都初始化完成前不执行firstSearcher这个事件,为什么要这样做了,和我们接下来要分析的getSearcher(false, false, null, true)这个方法有莫大的关系。

    方法定义如下:

          

public RefCounted<SolrIndexSearcher> getSearcher(boolean forceNew, boolean returnSearcher, final Future[] waitSearcher, boolean updateHandlerReopens)
forceNew:true表示强制创建searcher
returnSearcher:true表示返回创建的searcher本质就是searcher引用加1
  

 

   我们具体代码来分析,首先

      

  if (_searcher!=null && !forceNew) {
        if (returnSearcher) {
          _searcher.incref();
          return _searcher;
        } else {
          return null;
        }
      }
   在solrcore初始化的时候_searcher=null,根据上面提到的参数做相关的处理;

 

  
if (onDeckSearchers>0 && !forceNew && _searcher==null) {
        try {
          searcherLock.wait();
        } catch (InterruptedException e) {
          log.info(SolrException.toStr(e));
        }
      }

      // check again: see if we can return right now
      if (_searcher!=null && !forceNew) {
        if (returnSearcher) {
          _searcher.incref();
          return _searcher;
        } else {
          return null;
        }
      }
  两次检查,如果发现其他线程在构建search当前线程等待,等待其他线程构建完成直接返回!
searchHolder = openNewSearcher(updateHandlerReopens, false)
  创建一个新的searcher,具体过程就根据SolrIndexSearcher构造函数创建一个searcher 然后包装返回。由于初始化solrcore不存在solr相关的缓存的,所以不存在相关缓存的预热过程,在这个就跳过。后续详细分析。
      if (currSearcher==null && firstSearcherListeners.size() > 0) {
        future = searcherExecutor.submit(
            new Callable() {
              
              public Object call() throws Exception {
                try {
                  for (SolrEventListener listener : firstSearcherListeners) {
                    listener.newSearcher(newSearcher,null);
                  }
                } catch (Throwable e) {
                  SolrException.log(log,null,e);
                }
                return null;
              }
            }
        );
      }

      if (currSearcher!=null && newSearcherListeners.size() > 0) {
        future = searcherExecutor.submit(
            new Callable() {
              
              public Object call() throws Exception {
                try {
                  for (SolrEventListener listener : newSearcherListeners) {
                    listener.newSearcher(newSearcher, currSearcher);
                  }
                } catch (Throwable e) {
                  SolrException.log(log,null,e);
                }
                return null;
              }
            }
        );
      }
  solr相关的事件处理。这个就和上面提到的solrcore构造函数中线程池阻塞有关系.solr构建searcher包含两个事件,在solrconfig文件中可以进行配置,如下
   <listener event="newSearcher" class="solr.QuerySenderListener"/>
   <listener event="firstSearcher" class="solr.QuerySenderListener">
    newSearcher:每次创建新的searcher的时候都执行一次
    firstSearcher:solrcore初始化的时候,只执行一次
  我们可以通过上面的两个事件做一些数据的初始化,进行相关数据的查询预热。
  以上分析比较粗糙,省略了相关细节在后续会慢慢补上,敬请关注!
 
 
分享到:
评论
1 楼 qindongliang1922 2014-05-05  
不错,加油!

相关推荐

    lucene&solr原理分析

    lucene&solr原理分析,lucene搜索引擎和solr搜索服务器原理分析。

    Solr技术分析及运用

    Solr技术分析及运用主要涉及的是Apache Solr这一开源全文搜索引擎服务器的使用和配置。Solr基于Lucene,提供了一套高效、可扩展的搜索解决方案。以下是对Solr的详细说明: 1. Solr简介: - Solr是Java开发的搜索...

    Apache Solr(solr-8.11.1.zip)

    7. **分析链**:Solr的分析链允许用户自定义输入数据的预处理过程,如分词、标准化和过滤,这在处理不同语言和文本格式时非常有用。 8. **搜索性能优化**:Solr提供了多种优化手段,包括使用倒排索引、缓存策略、...

    solr技术分析及运用超详细教程

    solr技术分析及运用超详细教程solr开发指南,包括solr服务器搭建,新增数据库配置,配置增量更新,配置分词器,常见异常,删除默认字段,调试技巧,solr日志,,solr基本查询语法,solr多字段匹配,solri集成solr...

    solr讲解,案例分析

    6. **性能调优**:分析索引大小、硬件资源、网络延迟等因素对Solr性能的影响,以及如何通过调整配置参数来提升性能。 7. **日志和监控**:了解如何配置和使用Solr的日志系统,以及利用工具如Zabbix或Grafana来监控...

    solr(solr-9.0.0.tgz)

    Solr-9.0.0是该软件的最新版本,此版本可能包含了一些新的特性和改进,比如性能优化、新的查询语法、更强大的分析器等。 在Solr-9.0.0的压缩包中,通常会包含以下组件: 1. **bin** 文件夹:这个目录下有启动和...

    Apache Solr(solr-8.11.1.tgz)

    7. **contrib 目录**:包含了一些社区贡献的模块,如数据分析器、搜索组件和请求处理器等,这些可以扩展Solr的功能。 在Solr 8.11.1版本中,可能包含以下特性: - **性能优化**:Solr团队不断努力提升查询速度和...

    solr-6.2.0源码

    通过分析Solr 6.2.0的源码,我们可以深入了解其内部工作机制,包括索引构建、查询处理、分布式协调等核心模块。源码中包含了丰富的注释和示例,帮助开发者深入理解Solr的设计思想和实现细节。 总结来说,Solr 6.2.0...

    solr(solr-9.0.0-src.tgz)源码

    源码分析是深入理解一个软件系统工作原理的重要途径,对于Solr这样的复杂系统尤其如此。这里我们将围绕"solr-9.0.0-src.tgz"这个源码包,详细探讨其主要组成部分、核心功能以及开发过程中的关键知识点。 1. **Solr...

    match-query-parser,在solr中使用不同的查询时间分析器搜索单个字段.zip

    默认情况下,Solr使用标准查询分析器(Standard Query Parser),但有时我们可能需要针对特定字段定制查询行为,例如,处理特殊查询语法或执行精确匹配。这就是`match-query-parser`发挥作用的地方。 `match-query-...

    solr服务器_solr_

    Solr服务器是Apache Lucene项目的一个子项目,是一款开源的企业级搜索平台,专门用于处理大量文本数据的全文检索、搜索和分析。它基于Java开发,能够处理多种数据源,包括XML、JSON、CSV等,提供了高效、可扩展的...

    solr增量更新架包apache-solr-dataimportscheduler.jar

    Apache Solr 是一个开源的全文搜索引擎,广泛应用于各种企业级数据搜索和分析场景。增量更新是Solr的一个关键特性,它允许系统仅处理自上次完整索引以来发生更改的数据,从而提高了性能并降低了资源消耗。"apache-...

    solr-7.4.0.zip

    Solr 7.4.0版本引入了许多新特性,比如增强的查询分析器,支持更丰富的JSON查询语法,以及性能上的优化。此外,它还支持动态字段和字段类型,方便处理各种数据结构。SolrCloud模式允许你构建高可用和可扩展的搜索...

    Solr项目源码及solr资源包

    1. **Apache Solr**:Solr是一个开源的企业级全文搜索引擎,它提供了高效、可扩展的搜索和分析功能。它支持多种数据源,可以处理大量结构化和非结构化数据,提供快速的全文搜索、近实时搜索、富文本处理、地理位置...

    solr-4.4.0.tgz

    - **新功能和模块**:例如,添加了对地理位置搜索的支持,增强了数据分析处理能力等。 2. **安装 Solr 4.4.0**: - 首先,你需要在 Linux 系统上下载并解压“solr-4.4.0.tgz”文件,可以使用 `tar -zxvf solr-...

    Apache Solr 架构分析内部设计篇PDF

    由于描述中提到的PDF文档主要聚焦于Solr的内部架构分析和设计,我们可以从以下几个方面展开知识点的详细解释。 首先,从Solr源码架构分析设计角度来讲,内部设计是复杂且多层次的。这涉及到几个主要的组件和概念,...

    solr ik分词器

    6. **测试分词器**:最后,你可以通过Solr的分析界面(通常在`http://your-solr-url/admin/analysis.jsp`)输入文本,检查IK分词器是否正确工作。 在实际应用中,可能还需要根据具体需求调整分词策略,例如添加...

    solr-4.10.3.rar

    索引过程包括分析、字段处理、倒排索引等步骤,这些都使得Solr能够在大量数据中快速找到相关结果。查询时,Solr支持多种查询语法和过滤器,可以进行复杂查询和排序。 3. **配置与部署**:Solr的配置文件位于`conf`...

Global site tag (gtag.js) - Google Analytics