在《將文件傳送給Solr服務器》中,介紹了怎么樣將文件通過HTTP的post請求傳送給Solr,這個過程其實是由Solr中的update handler控制的。總的來說,update handler負責所有更新索引的操作以及commit和優化功能。Update handler提供的功能如下:
Update handler最重要的一個任務就是將document提交到索引中并讓它們能出現在搜索結果中。
將document提交到索引中
當一個文件被添加到Solr的時候,如果沒有執行commit操作,那么這個文件就不會出現在搜索結果中。從Solr 4之后,有兩種類型的commit可以被選擇:
Normal/hard commit :
Normal commit實現的是將Solr中所有沒有提交的文件flush到硬盤中,并打開一個searcher,使得所有新提交的文件都能被索引到。因為Normal commit是將所有新文件存儲到硬盤中,所以當Solr服務器重新開啟的時候,這些文件也不會丟失。此外,Hard commit可能是一個很耗時的操作,因為它需要打開一個新的searcher。
Soft commit:
Soft commit實現的是近實時的檢索(near real-time, NTR).Soft commit避開了Hard commit中一些耗時的操作,如將文件flush到硬盤中,但是hard commit還是必需的,不然文件都沒法保存到硬盤中。
總的來說,Hard commit保證document能被檢索到,但是因為它要將文件都保存到硬盤中所以可能會很耗時;Soft commit也能讓document被檢索到,但是這些文件并沒有被flush到硬盤中。
AutoCommit
無論是soft還是hard commit,都可以在Solr的solrconfig.xml文件中配置自動提交策略,下面有三種自動提交的策略:
在特定的時間提交文件
當未提交的文件達到某個閾值的時候就將所有文件都提交
每隔一段時間(如10mins)就將所有未提交的文件
下面展示了在solrconfig.xml中autoCommit的配置:
現在假設如下場景:
你需要將5百萬個文件提交到索引,使用的是如上面的自動提交策略,因為當前已經到達了50,000個文件的閾值,所以Solr要執行100次自動提交的操作。此時<openSearcher>設置是true,也就是說要執行100次打開新searcher的操作,而且每次打開一個searcher都要進行warming,但是這明顯是沒有必要的。所以,當要提交到索引的文件數目大于autocommit的閾值時,可以考慮將<openSearcher>設置為false,并在客戶端中執行一次hard commit就可以了。
在這里要區別一下<autoCommit>中的<openSearcher>以及<commit>中的waitSearcher屬性。waitSearcher為true時,表示客戶端的代碼會被阻塞,直到一個新的searcher被完全warm up。
設置soft commits的示例:
在solrconfig.xml中對soft commit的描述:
<!-- softAutoCommit is like autoCommit except it causes a
'soft' commit which only ensures that changes are visible
but does not ensure that data is synced to disk. This is
faster and more near-realtime friendly than a hard commit.
-->
疑問:soft commit是否也會打開一個新的searcher,不然新的文件是怎么被檢索到的。
添加文件到索引的過程: