几种Lucene.Net打开IndexReader的方式
入门第一式:
IndexReader.Open(Dir,readOnly);
当readOnly为true的时候效率最高,最好不要用Reader删除修改记录;
入门第二式:
reader.Reopen(readOnly);
优点:比第一式效率高,推荐使用;
缺点:前提是需要有Reader存在;
入门第三式:
writer.GetReader();
优点:NRL的实现,对实时性要求高的不二选择;
缺点:writer说它很痛苦,因为每次调用内部都会flush一次以保证所有index会被启用;
追求效率(中阶):
public class IndexReaderProxy { private IndexReader _indexReader; private readonly object _indexReaderLock = new object(); public IndexReaderProxy(Directory directory, bool readOnly) { _indexReader = IndexReader.Open(directory, readOnly); } public IndexReader GetCurrentIndexReader() { ReopenIndexReaderIfNotCurrent(); return _indexReader; } private void ReopenIndexReaderIfNotCurrent() { if (_indexReader.IsCurrent()) return; lock (_indexReaderLock) { if (_indexReader.IsCurrent()) return; var newIndexReader = _indexReader.Reopen(); _indexReader.Close(); _indexReader = newIndexReader; } } }
优点:效率和实时的一个平衡,在对实时要求不高的地方使用;
缺点:不属于NRL范畴,对实时性要求较高的地方就无法使用了;