优化solr中那难缠的facet

solr中facet功能对于特定字段的统计任务非常实用,可以对特定字段的term进行统计排序,对于单核的小数据来说还好,但是当数据变得很大时,需要进行multicore进行shards查询时,facet功能消耗的内存会异常的高。 对于solr4.2版本来说,通过facet.offset和facet.limit可以实现翻页查询,通过小翻页能够降低内存的使用。但是并不是可行之计,测试进行每页1个结果的翻页,在亿级规模多核上的facet查询还是会很快把64G服务器的JVM爆掉。如果只是去找很少的一些结果,另一种可以人工简化的操作是进行逐一单核查询,取topN,然后扔给前端归并,效果会好很多。 大规模的全局facet功能本是件很头疼的事,solr4.4版本在schema.xml中增加了一个字段属性 docValues, (其实是从4.2版本开始就有了,不过schema中没有介绍,而且并没有完善其功能,所以被忽视了) 在solr4.4中能对solr的facet功能进行优化的有两点: 1. docValues,配置方法:在schema.xml中的字段配置添加docValues属性,例: <field name=“test” type=“string” indexed=“true” stored=“false” docValues=“true” omitNorms=“true” default=“”/>   2. 在schema.xml中为facet配置一特殊的fieldType, String_disk. 这样能够大量节省很多的内存,因为默认的配置方法是docValuesFormat=”Lucene42″,相关更多介绍可以参见docValues: <fieldType name=“string_disk” class=“solr.StrField” docValuesFormat=“Disk” />   配置特殊订制的字段需要在solrconfig.xml中进行相应的配置: <codecFactory class=“solr.SchemaCodecFactory”/>   通过上面的两种配置方法能够大手笔的优化solr中比较难缠的facet爆JVM问题。

获取当前solr.xml中register的所有coreName

有时候需要通过对solr实例URL的一次http访问,获得该实例当前register的存活core,实现方法如下: public static List<String> GetShardsList(String serverName) {        List<String> shardlist = new ArrayList<String>();        //http://localhost:8080/solr        HttpSolrServer server = new HttpSolrServer(serverName);        server.setConnectionTimeout(1000);        server.setDefaultMaxConnectionsPerHost(100);        server.setMaxTotalConnections(100);        server.setRequestWriter(new BinaryRequestWriter());        // Get Shards        SolrQuery solrQuery = new SolrQuery();        solrQuery.setParam(CommonParams.QT, “/admin/cores”);        solrQuery.setParam(CoreAdminParams.ACTION, CoreAdminParams.CoreAdminAction.STATUS.name));        QueryResponse ds = null;        try {            ds = server.query(solrQuery);        } catch (SolrServerException e1) {            // TODO Auto-generated catch block            e1.printStackTrace();        }        NamedList<NamedList<Object>> ctLst = (NamedList<NamedList<Object>>)ds.getResponse().get(“status”);// 得到响应的头信息 … 继续阅读

利用solrj加载卸载solr多核并更新solr.xml

在使用solr多核时会有这样的需求,动态的加载卸载新core,并更新solr.xml 这样的实现比较容易,实验版本为solr4.2,solr5之后可能会有比较大的改动,还没有出,目前solr4.4的solr.xml配置还是兼容的: 1.动态加载新core public  static void load_solrCore(String coreName, String insPath, String serverName){              try {               //path=”D:/jacoxu/solrHome/multicore/collection0″;            //serverName=”http://localhost:8080/solr”;            HttpSolrServer tempServer= solrServer.setServer(serverName);               CoreAdminRequest.createCore(coreName, insPath, tempServer);           } catch (Exception e) {               e.printStackTrace();           }       }     2.动态卸载旧core public static void unload_solrCore(String coreName, String serverName) {        try {            HttpSolrServer tempServer= solrServer.setServer(serverName);            CoreAdminRequest.unloadCore(coreName, tempServer);        } catch (Exception e) {            e.printStackTrace();        }    }   3.有时在执行上面两个操作的时候需要动态的更新solr.xml,因为如果突然断电或solr服务重新启动,都需要重新初始化solr.xml文件中的多核配置,为了能恢复中断前的多核状态需要能够实时根据上面的两个操作更新solr.xml 只需要配置solr.xml中 … 继续阅读

订制tomcat下的logs输出路径

tomcat输出的日志比较多,对于处理实时数据流的实例,每天可以产生上百M的log日志,位于tomcat/logs目录下,维护一个完整的大系统,希望自定义一个日志路径,但是tomcat日志过于繁多。对于一个使用solr4.4版本实例的tomcat用户来说,需要修改的地方大致有4个地方: 1,修改tomcat/conf/logging.properties 中的${catalina}/logs 路径 –> 所有的.log日志 1catalina.org.apache.juli.FileHandler.level = FINE #设置日志级别 1catalina.org.apache.juli.FileHandler.level = FINE #日志级别为FINE 1catalina.org.apache.juli.FileHandler.level = OFF #禁用日志输出 1catalina.org.apache.juli.FileHandler.level = ALL #输出所有日志 级别一般分为:SEVER > WARNING > INFO > CONFIG > FINE > FINER > FINEST 2,修改tomcat/conf/server.xml中最后的directory=”logs”路径 -> localhost.date.txt日志 不需要时,注释掉以下代码即可 <!– … 继续阅读