2010-01-19 5 views
2

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

Вот мой код:

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

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

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! Lazy загрузил результаты поиска от Lucene, именно то, что я искал. Wahoo! :-)