最後發現了elasticsearch這個分布式搜尋方塊架,我一看它的介紹就覺得,就是它了。它基本上所有我想要的特性都包含了,分布式搜尋,分布式索引,零配置,自動分區,索引自動負載,自動探索,restful風格介面。於是就開始使用,部署了四台機器,並把索引導了進去,我設定的分區為3,即把索引分成三片,副本為2,即有兩份完整的索引。
通過它的管理工具可以很清晰的看到它索引分布的情況:哪塊分布在那裡,佔用空間多少都可以看到,並且可以管理索引。還發現當一台機掛了時,整個系統會對掛機裡的內容重新分配到其它機器上,當掛掉的機重新加入叢集時,又會重新把索引分配給它。當然,這些規則都是可以根據參數進行設定的,非常靈活。對它的搜尋效率進行測試,查詢時間基本上維持在200毫秒左右,第二次搜尋的話因為有緩衝,所以和solr差不多。但經過詳細對比測試後發現,solr在建索引時的查詢效能非常之差,因為solr在建索引時會產生io的阻塞,造成搜尋效能的下降,但elasticsearch不會,因為它是先把索引的內容儲存到記憶體之中,當記憶體不夠時再把索引持久化到硬碟中,同時它還有一個隊列,是在系統空閑時自動把索引寫到硬碟中。
它的儲存方式有四種,1.像普通的lucene索引,儲存在本地檔案系統中。2.儲存在Distributed File System中,如freeds。3.儲存在hadoop的hdfs中。4.儲存在亞馬遜的s3雲平台中。它支援外掛程式機制,有豐富的外掛程式。比如和mongoDB couchDB同步的river外掛程式,分詞外掛程式,hadoop外掛程式,指令碼支援外掛程式等。它有個第三方的solr介面類比外掛程式,使用這個外掛程式可以使你原本基於solr的系統無須改代碼直接切換到elasticsearch中,它還是個准即時的搜尋引擎,所謂即時搜尋引擎就是當你索引一個文檔後你搜尋這個文檔立即就能搜尋到。於是就決定使用這套分布式搜尋方塊架。
後記:之前還簡單瞭解過LinkedIn的zoie,它也是個准即時搜尋方塊架,不過它是不支援分布式的,現在LinkedIn開源出了基於zoie的分布式搜尋方塊架sensei,這個沒研究過,有空可以試下。
elasticsearch solr對比評測:http://engineering.socialcast.com/2011/05/realtime-search-solr-vs-elasticsearch/
elasticsearch官網:http://www.elasticsearch.org/
參考資料:http://www.searchtech.pro/articles/2013/02/18/1361194952868.html