参考代码:
DirectUpdateHandler2. addDoc0()
SolrConfig.loadUpdatehandlerInfo()
以下是结论:
1. Soft commit是保存在cache中,而hard commit是保存到磁盘的索引文件中;(此处有保留,softcommit后且未hardcommit,shutdown,再start,solr中的索引未丢失,所以softcommit是否也保存到了某处?)
2. Soft commit一定能搜到,但不一定保存到磁盘,hard commit不一定能搜到,但是一定保存到磁盘。
3. Index一个doc,没有指定是不是commit,默认是soft commit。
这是看solrconfig.xml中的配置项updateHandler,它有个子配置项为commitWithin/softCommit,默认是没有配置的,默认值是true。
<commitWithin>
<softCommit>true</softCommit>
</commitWithin>
4. 如果index一个doc时,传入了参数commitWithin(多少ms后commit),那么如果在soft commit下,就是在多少ms后soft commit,如果是hard commit就是在多少ms后hard commit。
若此参数为-1,或者没有传入(没传入的默认值就是-1),那就是不commit,只能等待auto commit。
5. auto soft commit和auto hard commit都是有的,看配置项updateHandler/autoCommit和updateHandler/autoSoftCommit。若是maxDocs和maxTime都是-1,那代表都不auto commit了。
6. 在solrconfig.xml中的配置项updateHandler中,还有个子配置项为autoCommit/openSearcher,默认是false。
<autoCommit>
<maxTime>${solr.autoCommit.maxTime:15000}</maxTime>
<openSearcher>false</openSearcher>
</autoCommit>
这个项很有意思,它仅存在在auto hard commit的配置(autoCommit是auto hard commit, autoSoftCommit是auto soft commit)中,它的意思是在hard commit后,是不是使得新的索引被search可见。
auto soft commit是没有这一项,因为它一旦commit,一定是search可见的(可以搜索到)。
但是auto hard commit中,如果这一项为false,且updateHandler/commitWithin/softCommit为false(表示当前是hard commit),那么你提交一个doc,不管配置commit=true还是commitWithin=1000,又或者已经达到了auto hard commit的时间,等到hard commit结束后,你依然无法搜索到这个文档。永远!(当然你reload整个collection是可以的)
7. 给第6条总结一下:如果是soft commit了,一定能搜索到,如果是hard commit+ openSearcher为true了,也一定能搜索到。
8. 结论是:最好同时配置updateHandler/autoCommit和updateHandler/autoSoftCommit,不要配置updateHandler/commitWithin/softCommit。如果是按照maxTime来 配置,那updateHandler/autoCommit/maxTime要长,比如24小时,updateHandler/autoSoftCommit/maxTime要短,比如1分钟,updateHandler/autoCommit/openSearcher配置为false(就是hard commit仅用来更新索引文件,不影响search)。
9. 默认的配置项是这样的:
<updateHandler class="solr.DirectUpdateHandler2">
<updateLog>
<str name="dir">${solr.ulog.dir:}</str>
<int name="numVersionBuckets">${solr.ulog.numVersionBuckets:65536}</int>
</updateLog>
<autoCommit>
<maxTime>${solr.autoCommit.maxTime:15000}</maxTime>
<openSearcher>false</openSearcher>
</autoCommit>
<autoSoftCommit>
<maxTime>${solr.autoSoftCommit.maxTime:-1}</maxTime>
</autoSoftCommit>
</updateHandler>
解读一下:index时使用soft commit,如果index时没有commit,那么永远不会soft commit,过15s后hard commit,但是搜索不到,除非你reload collection。
commit的线程名是commitScheduler**
原文:https://www.cnblogs.com/sheshouxy/p/13947643.html