• lucene_indexWriter说明、索引库优化


    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 {
    	@Test
    	public 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();
    就可以
    在运行完上述代码后,索引库的结构为:
    能够看出把该合并的项都合并了。把del文件彻底所有删除掉了。


    自己主动合并文件

    indexWriter.setMergeFactor(3);

    当cfs文件的数量为3个时,这是会自己主动合并成一个文件。
    假设没有设置数量,默认情况下为10;

  • 相关阅读:
    Codeforces A. Bear and Big Brother
    codeforces A. In Search of an Easy Problem
    c#判断两个对象和对象中的属性是否相同(以及记录对象中的哪些字段,和详细的改变情况)
    生成随机字符串
    SQL语句计算距离今天生日还差几天
    sqlServer 获取最新的一条数据
    c#所有部门及其下所部门生成树形图(递归算法获取或键值对方式获取)
    根据中文名,自动生成首字母的拼音码或拼音码(两种方法)
    char/varchar/nvarchar的区别
    c#中ofType的用法
  • 原文地址:https://www.cnblogs.com/blfshiye/p/5272222.html
Copyright © 2020-2023  润新知