在Lucene中,有幾種索引存放模式呢?用過的人可能記得SimpleFSDirectory、MMapDirectory、NIOFSDirectory、RAMDirectory這四種。新版本的通過FSDirectory.open可以自動獲得最優的一種:
public static FSDirectory open(File path, LockFactory lockFactory) throws IOException { if ((Constants.WINDOWS || Constants.SUN_OS) && Constants.JRE_IS_64BIT && MMapDirectory.UNMAP_SUPPORTED) { return new MMapDirectory(path, lockFactory); } else if (Constants.WINDOWS) { return new SimpleFSDirectory(path, lockFactory); } else { return new NIOFSDirectory(path, lockFactory); } }
通過這段代碼,我們級別可以了解各種Directory在哪種條件下是最優的。
MMapDirectory 內存映射索引模式,一部分放在內存,一部分放在磁盤,但是需要操作系統支持,最好是64位系統和64位JVM,這樣內存才能達到最大的應用。linux 和 windows基本都能用。
SimpleFSDirectory 簡單的磁盤存放,根據上面方法條件判斷,在當MMapDirectory無法使用的時候,如果是Windows操作系統,推薦磁盤存儲的模式。此種模式,會有大量的磁盤IO,因此索引的創建和檢索嚴重依賴磁盤性能。
NIOFSDirectory 使用NIO方式讀寫索引。這個條件更惡搞了,在它之前首先判斷windows。意味,在windows下它認為這個不是最優。主要原因:在windows下java nio存在bug。
RAMDirectory 這種內存存儲方式,在這個方法里沒有體現。它主要用來存放非持久化索引的,也就意味程序關閉,索引就丟失了。
NRTCachingDirectory 這是一種內存加磁盤存儲的模式,主要用在實時搜索的場景,這在高版本的lucene才有。在solr默認的索引存儲目錄就是它。
上面大致介紹了一下各種索引存放方式,再補充一句:上面各種在現有操作系統下都可以用,但是各種有自己的使用場景或者有自己缺點。
介紹完了lucene的索引目錄,那么再說說solr的索引存放目錄。solr是基於lucene封裝的,也就是lucene有的,solr也有,但是solr還有自己封裝的,我主要介紹下面HdfsDirectory 和BlockDirectory :
HdfsDirectory 把索引存放到hdfs上的,它的使用場景就是索引是海量的。一般不是大數據,不會把數據放到hdfs上。
BlockDirectory 根據名字我們可以知道,它把索引分成塊,在分布式存儲的一種概念,一切數據的存儲都是block。它是solr 4.x的產物,在后續版本中可能被替換。平常使用的不多。