在近实时搜索NRT(二)的文章中我们提到,Lucene提供了四种方法来获得StandardDirectoryReader对象,这里先简单总结下这四种open方法获取StandardDirectoryReader的差异:
-
方法一:DirectoryReader.open(final Directory directory)
-
方法二:DirectoryReader.open(final IndexCommit indexCommit)
- 我们如果使用封装了索引删除策略NoDeletionPolicy的SnapshotDeletionPolicy,我们可以记录每一次的提交,即IndexCommit(见近实时搜索NRT(一)),在索引目录中会生成多个segment_N文件,使用此方法可以获得任意一次提交的索引信息,可以用来回溯操作,故这种获取StandardDirectoryReader的方法
不属于
NRT
- 我们如果使用封装了索引删除策略NoDeletionPolicy的SnapshotDeletionPolicy,我们可以记录每一次的提交,即IndexCommit(见近实时搜索NRT(一)),在索引目录中会生成多个segment_N文件,使用此方法可以获得任意一次提交的索引信息,可以用来回溯操作,故这种获取StandardDirectoryReader的方法
-
方法三:DirectoryReader.open(final IndexWriter indexWriter)
- 该方法实际调用了方法四,区别在于另方法四中的两个参数applyAllDeletes为true、writeAllDeletes为false
-
方法四:DirectoryReader.open(final IndexWriter indexWriter, boolean applyAllDeletes, boolean writeAllDeletes)
- 由于在生成IndexWriter对象阶段会先读取索引目录中已有的索引信息(旧的索引信息),并且更改索引(新的索引信息)需要通过IndexWriter对象,故通过IndexWriter对象能获得索引目录中所有的索引信息,故方法三跟方法四获取StandardDirectoryReader的方法
属于
NRT
- 由于在生成IndexWriter对象阶段会先读取索引目录中已有的索引信息(旧的索引信息),并且更改索引(新的索引信息)需要通过IndexWriter对象,故通过IndexWriter对象能获得索引目录中所有的索引信息,故方法三跟方法四获取StandardDirectoryReader的方法
看这里:https://www.amazingkoala.com.cn/Lucene/Index/2019/0920/95.html