转自:http://jacoxu.com/%E5%85%B3%E4%BA%8Esolr%E7%9A%84%E5%90%84%E7%A7%8Ddirectoryfactory/
看到一个关于Solr的中文Book网站,介绍的有些简易,不过专注于Solr值得关注:http://www.solrcn.com/books/
最近快被Solr的Map Failed快弄崩溃了==b,继续调研。。。,还没好。下面从中摘一段关于SolrDirectoryFactory的配置,
Apache Lucene 以及 Solr 一个重要的属性是 Lucene 目录实现。目录接口为 Lucene 提供抽象的 IO 操作层。尽管选一个目录实现看起来很简单,但是在极端情况下,它会影响性能。以下将为你讲解如何选择正确的目录实现。
为了使用期望的目录,要做的就是选择正确的目录实现的工厂类,然后告知 solr。假设你打算使用 NRTCachingDirectory 作为你的目录实现,为了实现这个,需要在 solrconfig.xml 中设置以下内容:
这就是所有要做的,很简单,但是有哪些工厂可用呢,在Solr4.2版本中,有以下工厂可用:
solr.StandardDirectoryFactory
solr.SimpleFSDirectoryFactory
solr.NIOFSDirectoryFactory
solr.MMapDirectoryFactory
solr.NRTCachingDirectoryFactory
solr.RAMDirectoryFactory
现在,让我们分别看看每个工厂。
在深入了解每个工厂的细节前,我们先了解一些工厂的配置参数。directoryFactory 的参数一共两个,一个是 name,name 要设置成 “DirectoryFactory”,另外一个是 class,class 设置成我们所选的工厂实现类。
打算让 solr 自行决定使用哪个工厂时,可以使用 solr. StandardDirectoryFactory。该实现是基于文件系统形式的,依赖当前操作系统和 Java 虚拟机。
如果在一个小系统中使用,没有很多线程,这样可以使用 solr.SimpleFSDirectoryFactory,这个工厂将索引文件保存在本地的文件系统中,它不适用于大量线程访问的情况。
solr.NIOFSDirectoryFactory 可以适用于多线程同时访问,但是它在 Windows 平台不能很好工作,这是因为 JVM 的 bug。
solr.MMapDirectoryFactory 是从 solr 3.1 到 4.0 在 64 位 Linux 系统上的默认目录工厂。这个目录实现类适用虚拟内存和内核中一个叫 mmap 的特性来访问存在磁盘上的文件。它允许 Lucene 直接访问 I/O 缓存,当不需要准实时搜索时,这个目录实现是一个非常不错的选择。
如果需要准实时搜索,你需要使用 solr.NRTCachingDirectoryFactory,它设计成将索引的一部分放在内存中来加速准实时操作。
最后一个目录工厂是 solr.RAMDirectoryFactory,这是唯一一个非持久化的工程,整个索引是存放在 RAM 内存中,这样在系统重启或崩溃时,将丢失所有索引。这样你可能会问,那为什么使用这个工程?在自动完成功能和单元测试时,这种工程还是有用的。另外需要注意的是这种工程也不是为大数据设计的。
但是在服务器上建1亿数据时各种内存吃紧,有朋友这么建议:
“你那个内存消耗,肯定不适合mmap的,StandardDirectoryFactory太吃io了,solr.NRTCachingDirectoryFactory会导致jvmGC的压力太大,用NIO吧” 另外:”MergeFactor要根据数据要合理的调整,默认的10不行设大一点” 参考http://blog.csdn.net/pangliyewanmei/article/details/5733921
更专业的Factory解释还是要看Lucene in action第二版中文版2.10节 P52