Правильно используйте Lucene.Net IndexReader - PullRequest
0 голосов
/ 06 февраля 2019

В одном из моих WCF решений пользователь может выполнять поиск по индексу Lucene.Я ищу информацию о подходе.

Могу ли я улучшить этот код лучше?

public class ViewData
{            
        public static IndexReader indexReader
        {
            get
            {  
                return IndexReader.Open(FSDirectory.Open("path"), true);
            }
            private set { indexReader = value; }
        }
        public static IndexSearcher indexSearcher { get; set; }
}

Чтобы потреблять

using (indexSearcher = new IndexSearcher(indexReader))
{
    // run the search etc
}

Это означает IndexReader никогда не закрывается, когда поисковик открывается таким образом.

Но если я поступлю так, как показано ниже.

using (indexReader)
using (indexSearcher = new IndexSearcher(indexReader))
{
        // run the search etc
}

Но это значит, что считыватель всегда закрыт и вновь открыт?Могу ли я пропустить using(indexReader) и оставить его открытым (разве это не плохая практика, поскольку IndexReader - это Disposable)?

Ответы [ 2 ]

0 голосов
/ 15 февраля 2019

Вы можете повторно использовать экземпляры IndexReader и IndexSearcher для нескольких запросов.Они поточно-ориентированы и могут одновременно обслуживать несколько запросов.Нет необходимости закрывать или утилизировать ваши читатели и поисковые запросы, сборщик мусора справится с этим автоматически.На самом деле, это будет трудно сделать, если вы повторно используете экземпляры по нескольким запросам, поскольку вы не знаете, использует ли это кто-то одновременно.

0 голосов
/ 07 февраля 2019

В нашем приложении мы как бы избегаем проблемы, используя перегрузку конструктора IndexSearcher, которая принимает путь каталога Lucene.

Код выглядит примерно так:

using (var searcher = new IndexSearcher(FSDirectory.Open(new DirectoryInfo(_luceneSearchPath.GetActiveIndexPath()))))
{
    // run the search etc
}

В документации для конструктора, принимающего IndexReader, говорится, что " Если IndexReader был предоставлен неявно, указав каталог, то IndexReaderзакрывается.".Поэтому я бы сказал, что закрытие IndexReader - это то, что нужно делать.

Производительность при поиске в нашем приложении хорошая, проблем с утечками памяти не было.

...