IndexWriter
Hibernate的SessionFactory
在Hibernate中。一般保持一个数据库就仅仅有一个SessionFactory。由于在SessionFactory中维护二级缓存,而SessionFactory又是线程安全的。所以SessionFactory是共享的。
lucene的IndexWriter
假设同一时候在一个索引库中同一时候建立两个IndexWriter,比如:
IndexWriter indexWriter = new IndexWriter(LuceneUtils.directory,LuceneUtils.analyzer,MaxFieldLength.LIMITED);IndexWriter indexWriter2 = new IndexWriter(LuceneUtils.directory,LuceneUtils.analyzer,MaxFieldLength.LIMITED);
这种代码会出现异常
而lucene的文件夹结构:
.会出现write.lock这个文件。
由于当一个IndexWriter在进行读索引库操作的时候,lucene会为索引库。以防止其它IndexWriter訪问索引库而导致数据不一致,直到IndexWriter关闭为止。
结论:同一个索引库仅仅能有一个IndexWriter进行操作。
封装IndexWriter的类LuceneIndexWriter
public class LuceneIndexWriter {private static IndexWriter indexWriter = null;public static IndexWriter getIndexWriter() {if (indexWriter == null) {try {indexWriter = new IndexWriter(LuceneUtils.directory,LuceneUtils.analyzer, MaxFieldLength.LIMITED);} catch (CorruptIndexException e) {e.printStackTrace();} catch (LockObtainFailedException e) {e.printStackTrace();} catch (IOException e) {e.printStackTrace();}}return indexWriter;}public static void close() {if (indexWriter != null) {try {indexWriter.close();} catch (CorruptIndexException e) {e.printStackTrace();} catch (IOException e) {e.printStackTrace();}} else {System.out.println("indexWriter为空。不能关闭!
"); } } }
注:这里用单例模式做比較好。/*** 1、索引库的增、删、改是由indexWriter来操作的* 2、同一个时刻内。同一个索引库。仅仅能同意一个indexWriter操作* 3、当IndexWriter创建完毕以后。indexwriter所指向的索引库就被占据了,仅仅有当indexWriter.close时。才干释放锁的资源* 4、当一个新的indexWriter想拥有索引库时。原来的indexWriter必须释放锁* 5、仅仅要索引库中存在write.lock文件。说明上锁了* 6、indexWriter.close有两层含义:* * 关闭IO资源* * 释放锁* @author Administrator**/
public class IndexWriterTest {@Testpublic void testIndexWriter() throws Exception{IndexWriter indexWriter = new IndexWriter(LuceneUtils.directory,LuceneUtils.analyzer,MaxFieldLength.LIMITED);indexWriter.close();IndexWriter indexWriter2 = new IndexWriter(LuceneUtils.directory,LuceneUtils.analyzer,MaxFieldLength.LIMITED);}
}
索引库的优化
当运行创建索引多次时。索引库的文件如图所看到的:(索引里内容是一样的)
从图中能够看出来,每运行一次就生成一个cfs文件。当运行delete操作时,会生成如图所看到的的结构:
从图中能够看出来。lucene在运行删除的时候,是先把要删除的元素形成了一个文件del文件,然后再和cfs文件进行整合得出最后结果。
结论:假设添加、删除重复操作非常多次,就会造成文件大量添加。这样检索的速度也会下降。所以我们有必要去优化索引结构。使文件的结构发生改变从而提高效率。
结论:假设添加、删除重复操作非常多次,就会造成文件大量添加。这样检索的速度也会下降。所以我们有必要去优化索引结构。使文件的结构发生改变从而提高效率。
手动合并文件
合并多个小文件为一个大文件,降低IO操作:
在indexWriter.close();前加上
indexWriter.optimize();
就可以
在indexWriter.close();前加上
indexWriter.optimize();
就可以
在运行完上述代码后,索引库的结构为:
能够看出把该合并的项都合并了。把del文件彻底所有删除掉了。
自己主动合并文件
indexWriter.setMergeFactor(3);
当cfs文件的数量为3个时,这是会自己主动合并成一个文件。
假设没有设置数量,默认情况下为10;
当cfs文件的数量为3个时,这是会自己主动合并成一个文件。
假设没有设置数量,默认情况下为10;