`
chenchuan
  • 浏览: 17375 次
  • 性别: 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技术分析及运用的开发文档,从下载到运行的全过程。

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

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

    solr讲解,案例分析

    solr讲解,案例分析

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

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

    solr原理分析.xmind

    【图解版】solr原理分析,从全文检索到solr原理分析,并对出现的问题进行分析解答,不可用于商业用途,如有版权问题,请联系删除!

    java进阶Solr从基础到实战

    4. 各种中文分析器 章节二:Solr基础(下) 1. Solr基础知识 2. Solr查询 3. Facet查询 4. Group查询 5. 高亮查询 6. Suggest查询 7. SolrJ 章节三:Solr高级(上) 1. Solr Cloud 2. 函数查询 3. 地理位置查询 4. ...

    已编译版本solr-8.11.2.tgz

    他的主要特性包括:高效,灵活的缓存功能,垂直搜索功能,高亮下试搜索结果,通过索引复制来提高可用性,提供一套强大的data schema 来定义字段,类型和设置文本分析,提供基于web的管理界面等。

    solr基础知识介绍

    3. solr是什么 2 3.1 solr的功能 3 3.2 solr术语 3 3.2.1 Auto-warming 3 3.2.2 Facet 3 3.3.3 Document 6 3.3.4 Field 6 3.3.5 IndexWriter 6 3.3.6 IndexSearcher 6 3.3.7 Directory 6 3.3.8 Segment 7 3.3.9 ...

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

    通过在查询时传递查询分析器,严格控制solr查询解析和执行的方式。请在这篇博文中阅读更多内容。

    SOLR的应用教程

    3.6.4 Solr分词器、过滤器、分析器 42 3.6.5 Solr高亮使用 46 4 SolrJ的用法 46 4.1 搜索接口的调用实例 46 4.2 Solrj的使用说明 47 4.2.1 Adding Data to Solr 47 4.2.2 Directly adding POJOs to Solr 49 4.2.3 ...

    Solr-search过程源码分析

    详细阐述Solr-search 源码级别过程

    Solr权威指南-上卷

    不仅讲解了基本概念和使用方法,而且还分析了各组件的内部工作机制。 下卷(第11~16章) 细致、深入地讲解了Solr的高级知识和拓展知识。 高级知识部分包括:Solr的高级查询及其各种查询技巧,如函数查询、地理空间...

    Apache Solr 搜索架构分析外部设计篇PDF

    Apache Solr 搜索架构分析外部设计篇PDF Solr 源码 架构 分析 搜索

    solr 企业搜索引擎教程

    定制 Solr 索引的实现方法很简单,用 POST 方法向 Solr 服务器发送一 个描述所有 Field 及其内容的 XML 文档就可以了。定制搜索的时候只需要发送 HTTP GET 请求 即可,然后对 Solr 返回的信息进行重新布局,以产生利于...

    Solr权威指南-下卷

    不仅讲解了基本概念和使用方法,而且还分析了各组件的内部工作机制。 下卷(第11~16章) 细致、深入地讲解了Solr的高级知识和拓展知识。 高级知识部分包括:Solr的高级查询及其各种查询技巧,如函数查询、地理空间...

    Solr可视化工具Explain.solr.pl.zip

    Explain.solr.pl 是一个 Solr 的可视化工具,用来帮助你分析为什么一个文档会出现在搜索结果列表中。 支持 Solr: 3.0 3.1 3.2 3.3 3.4 3.5 标签:Explain

    Solr和ElasticSearch分析比较.docx

    Solr和ElasticSearch分析比较

Global site tag (gtag.js) - Google Analytics