一、IndexReader的删除操作
IndexReader也可以执行删除操作,使用IndexReader执行的删除操作不需要重新获取IndexReader对象了。使用IndexReader删除的前提是,在创建IndexReader对象的时候,要设置它的readonly为false。
indexReader = IndexReader.open(directory,false);
indexReader.deleteDocuments(new Term("id", "1"));
不过还是建议使用IndexWriter对象来执行删除操作,下面列举一下使用IndexReader执行删除操作可能存在的问题:
- 当有一个IndexWriter打开的时候,IndexReader的删除操作是不能够进行的,会报LockObtainFailedException。
- 当IndexReader被多个线程使用的时候,一个线程用其进行删除,会使得另一个线程看到的索引有所改变,使得另一个线程的结果带有不确定性。
- 对于更新操作,在Lucene中是先删除,再添加的,然而删除的被立刻看到的,而添加却不能够立刻看到,造成了数据的不一致性。
- 即便以上问题可以通过锁来解决,然而背后的操作影响到了搜索的速度,是我们不想看到的。
二、Directory的介绍
Directory下面有4个类:FileSwitchDirectory,FSDirectory,NRTCacheDirectory,RAMDirectory。
FSDirectory:FSDirectory又有3个实现类:SimpleFSDirectory,NOIFSDirectory,MMapDirectory,它们各自有各自的使用场景。使用FSDirectory.open(),由open()方法自动进行选择。
RAMDirectory:将索引信息存储到内存中,优点是速度快,缺点是不能持久化。
具体使用哪一种方式就根据具体的业务需求了。