当一个文档被添加到Solr中,但没有提交给索引之前,这个文档是无法被搜索的。换句话说,从查询的角度看,文档直到提交之后才是可见的。Solr有两种类型的提交:软提交和正常提交【也称硬提交】。
1.正常提交
Solr正常提交是将所有未提交的文档写入磁盘,并刷新一个内部搜索器组件,让新提交的文档能够被搜索。搜索器实际上可以看作索引中所有已提交文档的只读视图。可以这样说,硬提交是花销很大的操作,由于硬提交需要开启一个新搜索器,所以会影响到查询性能。
当正常提交成功后,新提交的文档被安全保存在持久存储器上不会因为正常的维护操作或服务器崩溃重启而丢失。出于高可用性考虑,如果磁盘发生故障,就需要一套故障转移方案,这一点在以后接着讨论。
2.软提交
软提交支持近实时搜索【Near Real-Time NRT】。软提交作为近乎实时可被搜索到的一种机制,跳过了硬提交的高消耗,例如,刷新到持久存储器就是花销较大的操作。软提交相对而言花销较低,可以每一秒都执行一次软提交,使得新近被索引的文档在添加到Solr之后很快被搜索到。但要记住,在某一时刻仍然需要执行硬提交操作,以确保文档最终被写入到持久化存储器中。
综上所述:
》硬提交让文档可被搜索,由于需要将其写入到持久化存储器中,所以花销较大
》软提交也可以让文档被搜索,不需要将其写入到持久化存储中
3.自动提交
不管是正常提交还是软提交,都可以采用以下三种策略中的一种来自动提交文档:
》在指定时间内提交文档
》一旦达到用户指定的未提交文档数阈值,就提交那么未提交的文档
》每隔特定时间间隔提交所有文档
4.配置
Solr硬提交与软提交的自动提交需要在solrconfig.xml中进行配置。
1 <!-- AutoCommit 2 3 Perform a hard commit automatically under certain conditions. 4 Instead of enabling autoCommit, consider using "commitWithin" 5 when adding documents. 6 7 8 9 maxDocs - Maximum number of documents to add since the last 10 commit before automatically triggering a new commit. 11 12 maxTime - Maximum amount of time in ms that is allowed to pass 13 since a document was added before automatically 14 triggering a new commit. 15 openSearcher - if false, the commit causes recent index changes 16 to be flushed to stable storage, but does not cause a new 17 searcher to be opened to make those changes visible. 18 19 If the updateLog is enabled, then it's highly recommended to 20 have some sort of hard autoCommit to limit the log size. 21 --> 22 <autoCommit> 23 <maxTime>${solr.autoCommit.maxTime:15000}</maxTime> <!-- 上一次提交到自动提交的最长时间间隔 --> 24 <openSearcher>false</openSearcher> <!-- 提交后是否开启一个新的搜索器 --> 25 </autoCommit>