Lucene4.3进阶开发之乱世丛生(二) FSDirectory



Lucene4.3进阶开发之乱世丛生(二)
  1. Directory directory=FSDirectory.open(new File(indexPath))  
通过这行代码,我们可以获取一个Directory的子类文件存储目录,然后我们对索引的一些操作,都是以这个子类的文件目录为基础的, 
lucene存储索引的几种方式: 


序号方式
1将索引存储在内存中
2将索引通过JDBC存储在数据库中
3将索引存储在一般的文件系统上,如Windows,Linux,Solaris
4将索引存储在分布式文件系统上,如HDFS

上面的几种存储方式是lucene目前为止,能够支持良好的的格式,那么今天,散仙要介绍的FSDirectory这类方式,就是上图表格中,第三类基于文件系统存储方式的根基,FSDirectory并不是一个具体的文件目录,通常情况下,我们使用的是FSDirectory下某一个具体的子类(MMapDirectory,SimpleFSDirectory,NIOFSDirectory)来作为我们的索引目录.

  1. public static FSDirectory open(File path, LockFactory lockFactory) throws IOException {  
  2.     if ((Constants.WINDOWS || Constants.SUN_OS || Constants.LINUX)  
  3.           && Constants.JRE_IS_64BIT && MMapDirectory.UNMAP_SUPPORTED) {  
  4.       return new MMapDirectory(path, lockFactory);  
  5.     } else if (Constants.WINDOWS) {  
  6.       return new SimpleFSDirectory(path, lockFactory);  
  7.     } else {  
  8.       return new NIOFSDirectory(path, lockFactory);  
  9.     }  
  10.   }
事实上我们通过open方法,lucene底层通常情况下,会给我们选择一个最适合我们当前操作系统用的索引目录,当然这种选择通常跟我们的JRE的位数是直接相关的,大多数的Solaris,Linux和windows64位系统的jre会返回MMapDirectory,而其他的一些位数的JRE,如32位的JRE在Windows上会返回SimpleFSDirectory,剩余的部分则会直接使用NIOFSDirectory来存储索引。
1,SimpleFSDirectory,这个类简单的实现使用RandomAccessFile来完成索引的存储,读写速度一般,并发性很差,在多个线程同时访问索引时,会造成线程同步,从而大大降低了性能,当然,如果我们并发性不是很大的话,使用它也是一个不错的选择

2,MMapDirectory使用内存映射IO的方式来操作索引,在性能上是非常优秀的,读写速度非常快,并发性支持一般,当然这种情况仅仅局限于,你的索引的大小小于系统内存的时候,这才是一个好的选择,否则,使用不当,将常常会造成内存溢出的异常。

3,NIOFSDirectory使用的是JAVA NIO的 FileChannel的来操作索引的,读写速度快,对并发支持非常优秀,因为它利用NIO的特性,避免了同步的读取,所以在高并发的场景下,这个目录往往是最佳的选择。 

我们来分析下FSDirectory的另外一个重要的方法sysc()。 

sysc这个方法,是从Directory这个顶级父类,继承过来的,由FSDirectory这个类,对其进行了重写,这个方法的目的,就是定期根据某些条件,来将我们内存或缓冲区的数据持久化到磁盘上,以确保我们已经索引的数据是非常安全的,不会因为一些意外情况,如系统崩溃,或突然宕机,停电的情况下,对索引结构造成破坏或一些影响。

一个简单的工作流程是这样的,当我们进行添加操作时,文件目录通常会打开一个或几个特定的文件格式来存储我们的数据,比如索引正文的存储,向量的存储,位置增量的存储,不同的索引格式负责存储不同的内容,当一些数据添加完毕后,通过某些条件触发持久化操作,比如超出了设置的缓冲区大小,或者超出了默认的Doc数,或者我们调用了commit方法,这时lucene会调用sysc方法,来把已经添加的数据,存储到磁盘上,以确保数据的安全存储,当然这些工作,lucene底层已经给我们实现好了,我们并不需要显示的调用这个方法来完成数据持久操作,就能绝大多数情况下,安全可靠的完成存储,而这一切正是sysc发挥的关键作用。
 
Please read full article from Lucene4.3进阶开发之乱世丛生(二)

No comments:

Post a Comment

Labels

Algorithm (219) Lucene (130) LeetCode (97) Database (36) Data Structure (33) text mining (28) Solr (27) java (27) Mathematical Algorithm (26) Difficult Algorithm (25) Logic Thinking (23) Puzzles (23) Bit Algorithms (22) Math (21) List (20) Dynamic Programming (19) Linux (19) Tree (18) Machine Learning (15) EPI (11) Queue (11) Smart Algorithm (11) Operating System (9) Java Basic (8) Recursive Algorithm (8) Stack (8) Eclipse (7) Scala (7) Tika (7) J2EE (6) Monitoring (6) Trie (6) Concurrency (5) Geometry Algorithm (5) Greedy Algorithm (5) Mahout (5) MySQL (5) xpost (5) C (4) Interview (4) Vi (4) regular expression (4) to-do (4) C++ (3) Chrome (3) Divide and Conquer (3) Graph Algorithm (3) Permutation (3) Powershell (3) Random (3) Segment Tree (3) UIMA (3) Union-Find (3) Video (3) Virtualization (3) Windows (3) XML (3) Advanced Data Structure (2) Android (2) Bash (2) Classic Algorithm (2) Debugging (2) Design Pattern (2) Google (2) Hadoop (2) Java Collections (2) Markov Chains (2) Probabilities (2) Shell (2) Site (2) Web Development (2) Workplace (2) angularjs (2) .Net (1) Amazon Interview (1) Android Studio (1) Array (1) Boilerpipe (1) Book Notes (1) ChromeOS (1) Chromebook (1) Codility (1) Desgin (1) Design (1) Divide and Conqure (1) GAE (1) Google Interview (1) Great Stuff (1) Hash (1) High Tech Companies (1) Improving (1) LifeTips (1) Maven (1) Network (1) Performance (1) Programming (1) Resources (1) Sampling (1) Sed (1) Smart Thinking (1) Sort (1) Spark (1) Stanford NLP (1) System Design (1) Trove (1) VIP (1) tools (1)

Popular Posts