Lucene多线程操作实现

本文介绍了在多线程环境下如何安全地使用Lucene。Lucene允许多个读操作并发,但不允许并发修改,内部通过锁机制保证线程安全。文章提供了一个IndexModifier Singleton类的实现,用于管理IndexWriter和IndexReader,确保线程安全地添加、删除和检索文档。此外,还讨论了使用Compass框架实现与Hibernate和Spring的集成,以实现实时索引和搜索功能。
摘要由CSDN通过智能技术生成

Lucene多线程操作实现

对于并发,Lucene 遵循以下规则:

1.
允许任意多的读操作并发,即任意数量用户可同时对同一索引做检索操作。
2.
即便正在进行索引修改操作(索引优化、添加文档、删除文档),依然允许任意多的检索操作并发执行。
3.
不允许并发修改操作,也就是说同一时间只允许一个索引修改操作。

Lucene
内部已经对多线程安全进行了处理,很多操作都使用了 lock 进行多线程同步锁定。只要遵循一定的规则,就可以在多线程环境下安全运行 Lucene
方案一:
建议:

1. Directotry
Analyzer 都是多线程安全类型,只需建立一个 Singleton 对象即可。
2.
所有线程使用同一个 IndexModifier 对象进行索引修改操作。
3. IndexWriter/IndexReader/IndexModifier/IndexSearcher
最好使用同一个 Directory 对象,否则多线程并发读写时可能引发 FileNotFoundException

IndexModifier
对象封装了 IndexWriter IndexReader 的常用操作,其内部实现了多线程同步锁定。使用 IndexModifier 可避免同时使用 IndexWriter IndexReader 时需要在多个对象之间进行同步的麻烦。等所有修改操作完成后,记住调用 Close() 方法关闭相关资源。并不是每次操作都需要调用 Optimize(),可以依据特定情况,定期执行优化操作。

--------

以下演示代码简单封装了一个 IndexModifier Signleton 类型,确保多线程使用同一个对象,且只能由最后一个多线程调用 Close 方法关闭。
代码不完善,仅供参考!需要做些修改才能应用于实际项目。

//索引修改器的获取和关闭

import java.io.File;

import java.io.IOException;

import java.io.StringReader;

import java.util.ArrayList;

import java.util.HashMap;

import java.util.Map;

 

import org.apache.lucene.analysis.Analyzer;

import org.apache.lucene.analysis.standard.StandardAnalyzer;

import org.apache.lucene.index.CorruptIndexException;

import org.apache.lucene.index.IndexModifier;

import org.apache.lucene.store.Directory;

import org.apache.lucene.store.LockObtainFailedException;

import org.apache.lucene.store.RAMDirectory;

 

 

public class MyIndexModifier {

    private static Analyzer analyzer = new StandardAnalyzer();

    private static IndexModifier modifier;

   

    private static ArrayList<Thread> threadList = new ArrayList<Thread>();

 

   

    private MyIndexModifier() { }

 

    static final File INDEX_DIR = new File("D:/docindex");

      public static IndexModifier GetInstance()

      {

          synchronized (threadList)

        {

          if (modifier == null)

          {

            try {

               

                modifier = new IndexModifier(INDEX_DIR, analyzer, false);

            

                //索引性能测试参数配置

               

                modifier.setMergeFactor(1000); 

           

               

                 System.out.println("MergeFactor: " + modifier.getMergeFactor());

                 System.out.println("MaxBufferedDocs: " + modifier.getMaxBufferedDocs());

            } catch (CorruptIndexException e) {

                e.printStackTrace();

            } catch (LockObtainFailedException e) {

                e.printStackTrace();

            } catch (IOException e) {

                e.printStackTrace();

            }

          }

 

          if (!threadList.contains(Thread.currentThread()))

            threadList.add(Thread.currentThread());

 

          return modifier;

        }

      }

 

      public static void Close()

      {

          synchronized (threadList)

        {

          if (threadList.contains(Thread.currentThread()))

            threadList.remove(Thread.currentThread());

 

          if (threadList.size() == 0)

          {

           try {

               if (modifier != null)

                {

                 

                modifier.close();

                modifier = null;

                }

            } catch (CorruptIndexException e) {

                e.printStackTrace();

            } catch (IOException e) {

                e.printStackTrace();

            }

          }

        }

      }

}

 

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值