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

solr中的SolrEventListener以及cache统计信息的获得

    博客分类:
  • solr
阅读更多

先声明一下,我的solr的版本是5.5.3

 

上一篇博客中说了当更新SolrIndexSearcher的时候并不是仅仅调用预热,还有其他的操作,那么都是有什么呢,看一下SolrCore的getSearcher方法(参数最多的一个),如果if (newSearcher != currSearcher) ,即索引发生了变化(无论是commit还是softCommit都算是变化),不仅仅是调用上一个博客中讲的warm,还有下面的操作:

if (currSearcher == null) {
    future = searcherExecutor.submit(new Callable() {
    @Override
    public Object call() throws Exception {
         try {
             for (SolrEventListener listener : firstSearcherListeners) {//循环firstSearcherListener,调用其newSearcher方法,第一个参数是新生成的searcher,第二个是null
                  listener.newSearcher(newSearcher, null);
                }
              } catch (Throwable e) {
                SolrException.log(log, null, e);
                if (e instanceof Error) {
                  throw (Error) e;
                }
              }
              return null;
            }
          });
        }

        if (currSearcher != null) {
          future = searcherExecutor.submit(new Callable() {
            @Override
            public Object call() throws Exception {
              try {
                for (SolrEventListener listener : newSearcherListeners) {//和上面的firstSearcherListener一样,只不过这里的参数的第二个是当前的searcher。
                  listener.newSearcher(newSearcher, currSearcher);
                }
              } catch (Throwable e) {
                SolrException.log(log, null, e);
                if (e instanceof Error) {
                  throw (Error) e;
                }
              }
              return null;
            }
          });
        }

上面的firstearcherListener和newSearcherListener都是 List<SolrEventListener>,即多个SolrEventListener,可以总结当切换SolrIndexSearcher的时候就会触发我们配置的listener的newSearcher方法,并且对于不同的名字(firstSearcherListener还是newSearcherListener)传入的参数还是不一样的。

 

如何配置监听呢?我是参考的这个博客:http://blog.csdn.net/duck_genuine/article/details/7862454

具体的配置为在solrconfig.xml中的<query></query>中添加下面的代码:

<listener event="newSearcher" class="com.comall.solr.listener.HelloWordListener">  <!--这个是配置的newSearcher,即传入新旧SolrIndexSearcher两个参数的-->
	<arr name="sortFields">   <!-- arr是封装为arraylist -->
		<str>title</str>  <!-- str是字符串 -->
		<str>id</str>  
	</arr>
	<!-- str是字符串 -->
	<str name="queryKeyFile">/Users/yzygenuine/56workspace/solr_jetty/solr/extConf/query.txt</str>  	
	<arr name="queries">  
		<lst> <!--lst是封装为NamedList  org.apache.solr.common.util.NamedList   这里的封装的结果是我做实验做出来的 -->
			<str name="q">solr</str>
			<str name="qt">standard</str>
			<str name="sort">price desc</str>
		</lst>  
	</arr>  
</listener>  

 我的HelloWordListener的代码为:

public class HelloWordListener extends AbstractSolrEventListener {//继承自org.apache.solr.core.AbstractSolrEventListener
	static Logger logger = LoggerFactory.getLogger(HelloWordListener.class);
	public HelloWordListener(SolrCore core) {
		super(core);
		logger.info("初始化HelloWordListener");
	}
	@Override
	public void init(@SuppressWarnings("rawtypes") NamedList args) {//初始化,args即配置的参数,我用这个来检测封装的类型。
		
		super.init(args);
		StringBuffer buffer = new StringBuffer();
		Object sortFields = args.get("sortFields");
		
		buffer.append("sortFields的类型是:")
			.append(sortFields.getClass().getName())
			.append("---")
			.append("queryKeyFile的类型是:");
		
		Object queryKeyFile = args.get("queryKeyFile");
		buffer.append(queryKeyFile.getClass().getName()).append("---").append("queries的类型是:");
		
		Object que = args.get("queries");
		buffer.append(que.getClass().getName()).append(",queries的第一个元素的类型是:").append(((ArrayList)que).get(0).getClass().getName())
			.append(",query的第一个元素是:").append(((ArrayList)que).get(0));
			
		logger.info("初始化参数是:{}", buffer.toString());
//		{sortFields=[title, id],queryKeyFile=/Users/yzygenuine/56workspace/solr_jetty/solr/extConf/query.txt,queries=[{q=solr,qt=standard,sort=price desc}]}	
	}
	@Override
	public void postCommit() {
		logger.info("调用postCommit");
	}
	@Override
	public void postSoftCommit() {
		logger.info("调用SoftCommit");
	}
	@Override
	public void newSearcher(SolrIndexSearcher newSearcher, SolrIndexSearcher currentSearcher) {//调用newSearcher,从结果来看的确是将两个searcher都传入进去了,并且这个也对softCommit做了测试,如果没有更新索引,softCommit是不会造成已经注册的SolrINdexSearcher发生变化的
		logger.info("调用newSearcher:newSearcher:{},currentSearcher:{}",new Object[]{newSearcher,currentSearcher});		
	}
}

 

本来我是抱着很大的希望使用这个listener的,我的本意是能够通过SolrIndexSearcher来获得里面的多个缓存,然后得到这些缓存的统计信息,但是遗憾的是SolrIndexSearcher并没有给我们方法来得到这些缓存(我本人是比较讨厌使用反射那种暴力操作的)。不过在  http://blog.csdn.net/duck_genuine/article/details/7862454  这篇博客中我有点启发——即我们使用这个新的searcher来做一些提前的搜索,这样不就能实现指定的热身了么,不过我自己倒是没有测试过,等需要的时候再做些测试吧。http://blog.csdn.net/duck_genuine/article/details/7862454,这个博客的主人看来对solr的研究不错,是个大神。

 

//下面的是后来补充的,

上面说我没有找到获得SolrIndexSearcher中cache的方法,现在找到了,在solrCore中有个getInfoRegistry方法,就是获得所有的当前注册的SolrIndexSearcher的信息的,这个方法在一个新的SolrIndexSearcher注册的时候调用,我们看一下注册方法:

  /** Register sub-objects such as caches   */
  public void register() {
    // register self 
    core.getInfoRegistry().put("searcher", this);//调用solrCore的getInfoRegistry方法
    core.getInfoRegistry().put(name, this);
    for (SolrCache cache : cacheList) {//这里的cacheList包括我们在solrConf.xml中配置的所有的cache,比如FilterCache,queryResultCache,DocumentCache,fieldValueCache,以及使用<cache>自定义的多个cache。
      cache.setState(SolrCache.State.LIVE);
      core.getInfoRegistry().put(cache.name(), cache);//将多个cache放入到core中,这样就会覆盖原来的cache。
    }
    registerTime = new Date();
  }

 这样我们就可以通过调用solrCore.getInfoRegistry来获得之前的SolrIndexSearcher的各种cache,然后获得其统计信息了。我改写的HelloWordListener的newSearcher代码如下:

public static final String filterCache_name = "filterCache";
public static final String queryResultCache_name = "queryResultCache";
public static final String documentCache_name = "documentCache";
public static final String fieldValueCache_name = "fieldValueCache";

@Override
public void newSearcher(SolrIndexSearcher newSearcher, SolrIndexSearcher currentSearcher) {
	Map<String, SolrInfoMBean> info = getCore().getInfoRegistry();
		
	SolrInfoMBean filterCache = (SolrInfoMBean) info.get(filterCache_name);
	logger.info(filterCache.getStatistics().toString());
	
	SolrInfoMBean queryCache = info.get(queryResultCache_name);
	logger.info(queryCache.getStatistics().toString());
	
	SolrInfoMBean documentCache = info.get(documentCache_name);
	logger.info(documentCache.getStatistics().toString());
	
	logger.info(info.get(fieldValueCache_name)==null?"fieldvalueCache是null":"fieldValueCache不是null");
}

 这样就能从控制台发现solr的缓存的使用情况了。在查询几次之后,提交一个新的document,这样就会调用listener,我自己做的测试的结果为:

{lookups=0,hits=0,hitratio=0.0,inserts=0,evictions=0,size=0,warmupTime=0,cumulative_lookups=0,cumulative_hits=0,cumulative_hitratio=0.0,cumulative_inserts=0,cumulative_evictions=0}//filterCache的
{lookups=26,hits=23,hitratio=0.88,inserts=3,evictions=0,size=3,warmupTime=0,cumulative_lookups=26,cumulative_hits=23,cumulative_hitratio=0.88,cumulative_inserts=3,cumulative_evictions=0}//queryResultCache的
{lookups=32,hits=22,hitratio=0.69,inserts=10,evictions=0,size=10,warmupTime=0,cumulative_lookups=32,cumulative_hits=22,cumulative_hitratio=0.69,cumulative_inserts=10,cumulative_evictions=0}//documentCache的
fieldValueCache不是null//可以发现fieldValueCache自己就会创建,尽管在solrconf.xml中没有配置。

 

 

 

 

分享到:
评论

相关推荐

    solr cache部分 中文解释

    在 Solr 中,缓存主要用作加速查询和过滤数据。以下是一些主要的缓存类型及其作用: 1. 查询结果缓存(QueryResultCache):存储查询结果文档的列表,使得相同的查询可以在不重新计算的情况下快速返回结果。这对于...

    solr中cache综述

    ### Solr中Cache综述及优化策略 #### 一、概述 Apache Solr是一个高性能、可伸缩的企业级搜索平台,它基于Lucene构建,在实际应用中为了提高查询效率和性能,内置了一系列缓存机制(Cache)。这些缓存机制不仅能够...

    Solr分组统计

    Facet功能在Solr中用于提供多维度的统计信息,它可以展示不同分类下文档的数量,帮助用户从不同角度查看数据分布。例如,在一个电子商务网站中,你可以使用facet来统计商品按类别、品牌或价格区间分组的数量,这有助...

    solr中文解析器以及使用文档

    总的来说,"solr中文解析器以及使用文档"这个主题涵盖了如何在Solr中配置和使用IK Analyzer进行中文文本处理,以及如何优化其性能以适应各种实际应用。通过深入学习这些内容,可以有效地提升Solr在中文环境下的搜索...

    solr中文文档.pdf

    2. **全文搜索概念**:全文检索是指在系统存储的数据中提取任意内容,并根据用户提供的查询词,通过分析和匹配,找出用户所需要的文档或信息的技术过程。 3. **SOLR与Lucene的关系**:SOLR是基于Lucene的一个开源...

    solr中文分词器

    Solr中文分词器是针对Apache Solr全文检索引擎在处理中文文本时的不足而设计的一种解决方案。Solr默认的分词策略主要针对英文文本,它以空格为分隔符进行分词,而对于中文这种没有明显分隔符的语言,就需要特定的...

    ikanalyzer-solr中文分词包兼容solr7.5

    在Solr中集成ikanalyzer,可以提高中文搜索的性能,使得搜索结果更加准确,用户体验得到提升。 在实际应用中,安装ikanalyzer-solr分词包的步骤大致如下: 1. 将`ik-analyzer-solr5-5.x.jar`添加到Solr服务器的`...

    Solr5.4中文分词

    `web.xml`是Solr的部署描述符,它定义了Solr服务器的启动参数和配置信息。在`solr-core.xml`或`solrconfig.xml`中,我们可以找到关于数据目录的配置,需要确保分词库能被正确地加载和使用。 具体步骤如下: 1. **...

    solr6.0中文分词

    在 Solr 6.0 中,IKAnalyzer 不仅可以继续为 Solr 5.x 提供服务,还增加了对新版本 Solr 的兼容性,确保了旧项目的平滑升级和新项目的稳定运行。 使用 IKAnalyzer 配置 Solr 6.0 或 5.x 的步骤大致如下: 1. **...

    solr中文分词高版本

    Solr是一款强大的全文搜索引擎,广泛应用于企业级的信息检索系统中。在处理中文内容时,一个合适的中文分词器是至关重要的。"solr中文分词高版本"的标题表明我们在这里讨论的是适用于Solr 6.5及以上版本的中文分词...

    支持solr5.5 solr6.0中IK分词需要的资料

    在Solr中,分词器(Tokenizer)是文本分析的重要组成部分,它负责将输入的原始文本拆分成可搜索的独立单元——词语。IK分词器(Intelligent Chinese Analyzer for Solr,简称IK)是一款针对中文的高效分词工具,专为...

    solr 中文分词

    Solr 是一个流行的开源搜索引擎,它提供了全文索引、高级查询功能以及数据分析能力。在处理中文文本时,分词是至关重要的一步,因为搜索引擎需要理解并拆分输入的中文句子成独立的词语来构建索引。"solr 中文分词" ...

    solr(中文分词器)集群

    在本压缩包中,包含Solr的源码,以及IK分词器和Zookeeper的相关内容。下面我们将详细探讨Solr集群的构建与使用,以及IK分词器和Zookeeper的角色。 首先,让我们来看看Solr集群的构建。一个Solr集群是由多个独立的...

    solr 5.x 和 6.x 最新中文分词器

    在Solr 5.x和6.x版本中,中文分词器扮演着至关重要的角色,它负责将中文文本拆分成有意义的词汇,便于索引和查询。下面将详细介绍Solr中的中文分词器及其相关知识。 一、Solr中文分词器概述 在处理中文文档时,由于...

    solr中文教程

    在 Solr 中,你可以通过修改配置文件来定制搜索行为,例如设置索引字段、分析器(包括中文分词器)以及查询行为。对于中文支持,Solr 提供了诸如 IK 分词器等插件,能够对中文文本进行有效的分词处理,从而提高搜索...

    solr中文分词器ik-analyzer-solr7.x

    总的来说,IK Analyzer与Solr7.x的结合,为处理中文信息的搜索引擎提供了一种高效、可定制的解决方案,使得中文文本的检索和分析能力得到了显著提升。无论是对于企业内部的信息检索,还是面向公众的服务,都能带来...

    solr中的mmesg4j中文分词器安装

    ### Solr中的MMSeg4J中文分词器安装与配置详解 #### 一、MMSeg4J简介 MMSeg4J是一款高效的Java实现的中文分词工具包,它基于统计和规则混合的方法来处理中文文本的分词问题。在搜索引擎如Solr中,通过集成MMSeg4J...

    solr-4.10.3

    10. **监控与管理**:SolrAdmin是Solr内置的Web界面,用于监控和管理Solr实例,包括查看统计信息、加载和删除索引、测试查询等。 总的来说,Solr-4.10.3作为一个稳定的版本,为用户提供了强大且灵活的全文搜索引擎...

    solr教材-PDF版

    - **1.2.2 Schema(模式)**:Solr中的模式文件(schema.xml)用于定义索引的字段、字段类型以及它们的行为。这是构建高效索引的基础。 - **1.2.3 查询**:Solr支持复杂的查询语言,包括全文检索、布尔运算符、短语...

Global site tag (gtag.js) - Google Analytics