场景描述:
在创建SolrCloud的索引时,发现数据量变少了。多次测试发现,每次创建索引都会少一部分,在运行其他创建索引程序时,之前的索引量会达到正确索引量,但是后面的又会少一部分。问题出在MapReduce程序中,有一次提交没有执行。
先了解下提交的几种方式:
- 硬提交(hard commit): solrService.commit(true,true,true)
硬提交是提交数据持久化到磁盘里面。
openSearcher=true:Solr/Lucene searchers 被重新打开,所有的cache都失效(索引段级别的cache不会失效),autowarming会执行。这是老版本文档唯一能看到新增加的文档的方法。openSearcher=false:如果要搜索新的文档,需要执行一次soft commit。
- 软提交(Soft commit): solrService.commit()
软提交是提交数据到内存里面,并没有持久化到磁盘。
它能使文档可见,但是会有一些代价。尤其是在solrconfig.xml里定义的顶层的cache(filterCache、queryResultCache等)会失效,autowarning会在顶层cache发生(比如filterCache、queryResultCache)。这时候,newSearcher的查询都会被执行,而且,fieldvaluecache也会失效。因此,facet查询也不得不等cache重新生成。在频繁的soft commit下,cache基本上没什么效果,在某些场景下,最好去掉它。然而,索引段级别的cache(比如fieldcache),用于function 查询,排序等,是基于索引段的,不会因为soft commit而失效,它们能继续被使用。
- 自动提交
设置soft commit时间间隔足够长,比如5分钟或更长(配置为-1则不自动soft commit)。soft commit是有关可见性的,大批量索引构建应该不是为了满足实时搜索的,所以没必要额外地打开任何类型的searcher。这里设置的是5分钟。项目中使用的是自动提交,则程序中不需要手动设置提交命令,服务器会自动提交。
自动提交设置如下:
总结:
1.硬提交:
硬提交是提交数据持久化到磁盘里面。
若想搜到结果openSearcher为true即可,openSearcher为false时,需要执行Soft commit
2.软提交:
软提交是提交数据到内存里面,并没有持久化到磁盘。
是比硬提交(openSearcher=true)使文档可见的更轻量级的操作
3.自动提交
则程序中不需要手动设置提交命令,服务器会自动提交。