Loading

几种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范畴,对实时性要求较高的地方就无法使用了;

posted @ 2012-05-03 18:27  today4king  阅读(659)  评论(0编辑  收藏  举报