查看文章 |
lucene索引的建立
2009-10-21 11:36
1.索引文件 .fdt文件:主要保存数据源数据,存储的field的值仅为Document中具有的Store.YES属性的field .fdx文件:记录当前Document在.fdt文件中的位置,以便后面读取时方便 segments文件:通常,在一个完整的索引中,有且只有一个segments文件,该文件没有后缀,它记录了当前索引中所有的 segment的信息 .fnm文件:包含了Document中的所有field名称 .tis文件:用于存储分词后的词条(Term); .tii文件:是.tis文件的索引文件,它标明了每个.tis文件中的词条的位置 deletable文件:类似于Windows的回收站原理,所有的文档在被删除后,会首先在deletable文件中留一个记录,要真正删 除时,才将索引除去。 2.文档倒排 作用:统计词条的位置和词频信息 说明:倒排完毕后,所有的词条都被放入到了一个HashTable中,它的key是词条的Term对象,value是Posting类型的对象 lucene首先将这个HashTable转化成一个Posting类型的数组,然后对这个数组进行排序,使所有的词条按字典顺序 排列。那样,就可以将词条信息写入到.tii和.tis文件中。另外,将频率和位置信息写入.frq和.prx文件中去 3.StandardAnalyzer能将标点过滤掉 4.FSDirectory和RAMDirectory FSDirectory:指的是在文件系统中的一个路径 RAMDirectory:是内存中的一个区域 二者都可以作为索引的存储路径 5.合并索引 用户不但可以将存放于不同文件系统路径下的索引合并,还可以将内存中的索引与文件系统中的索引进行合并,以次来 保存那些存放于RAMDirectory中的索引 注意:合并内存中的索引时,一定要先将其相应的IndexWriter关闭,以保证滞留在缓存中的文档被刷到RAMDirectory中 去,这点与试用FSDirectory时一样。如果不使用close方法关闭IndexWriter,就会发现索引文件并未真正写入目 录中去。 合并索引的目的:是为了减少目录内的索引文件的数量,以使lucene能够更快地处理索引,这将大大加快lucene的检索速 度。 6.索引的优化 目的:对整个索引目录内、未合并的segment进行一个优化的合并,以保证检索时的速度 IndexWriter的optimize()方法能够对当前IndexWriter所指定的索引目录及其所使用的缓存目录下的所有的segment做优化 使所有的segment合并成一个完整的segment,即整个索引目录内只出现一种文件前缀 7.试用文档ID号来删除特定文档 逻辑删除:(相当于windows的回收站) IndexReader reader=IndexReader(INDEX_STORE_PATH); reader.deleteDocument(0); reader.close(); 逻辑删除后恢复: IndexReader reader=IndexReader(INDEX_STORE_PATH); reader.undeleteAll(); reader.close(); 物理删除: IndexReader reader=IndexReader(INDEX_STORE_PATH); reader.optimize(); reader.close(); 8.lucene索引的同步问题 a. lucene的同步问题只可能发生在对索引进行文档添加、文档删除、合并segment和优化时 b. lucene有自己的锁机制可以防止非法操作的发生 write.lock出现在向索引添加文档时,或是将文档从索引中删除时 commit.lock主要是与segment合并和读取的操作相关 c. 开发者在开发应用的过程中,不能仅仅依赖于lucene的锁机制来防止非法操作的发生,而 是应该养成良好的编写具有同步特性的代码的习惯,才能编写出高质量的代码 9. lucene2.0以上的版本中出现了个新类,indexModifier类,它集成了IndexWriter的大部分功 能和IndexReader中的对索引删除的功能 |
最近读者: