Lucene.NET и ленивая загрузка - PullRequest
2 голосов
/ 19 января 2010

Вот хитрый вопрос: я хочу сделать ленивую загрузку поверх результатов поиска Lucene. Возможный?

Вот мой код:

public IEnumerable<BizObj> Search(string query)
{
   var parsedQuery = new QueryParser(...).Parse();
   var searcher = new IndexSearcher(parsedQuery, storage);
   try
   {
      var hits = searcher.Search(parsedQuery);

      // Hooray for LINQ's lazy-evaluated Select method!
      // But oh noes!! searcher will be closed by the time it
      // gets executed, thus resulting in an exception. :-(
      return hits.Select(hit => PullBizObjectFromDatabase(hit));
   }
   finally
   {
      searcher.Close();
   }
}

Код потребления:

var searchResults = from result in blah.Search("hello, world!")
                    where SomeBizLogic(result)
                    select result;

// Print the top 50 search results.
foreach (var result in searchResults.Take(50))
{
    // Exception! The searcher field inside Search(...) has been closed! :-(
    Console.WriteLine(result);
}

У меня вопрос, как мне лениво загрузить результаты поиска из Lucene?

Ответы [ 2 ]

2 голосов
/ 19 января 2010

Поработав с несколькими вариантами, я разобрался с ответом: используйте итератор доходности:

public IEnumerable<BizObj> Search(string query)
{
   var parsedQuery = new QueryParser(...).Parse();
   var searcher = new IndexSearcher(parsedQuery, storage);
   try
   {
      var hits = searcher.Search(parsedQuery);
      foreach (var hit in hits)
      {
         yield return PullBizObjectFromDatabase(hit);
      }
   }
   finally
   {
      searcher.Close();
   }
}

С помощью итератора возврата дохода поисковик не будет избавлен, пока потребители не закончат свои оценки. Brilliant! Ленивый загрузил результаты поиска из Lucene, именно то, что я искал. Wahoo! : -)

1 голос
/ 20 января 2010

Посмотрите на объект HitCollector. Например. http://rosowski.wordpress.com/2008/07/29/lucene-using-the-hitcollector/

...