2

Я использую Lucene.Net + SimpleLucene в моем приложении asp .net mvc. Существует проблема с созданием индекса из базы данных. Индекс, похоже, начинают создается хорошо, но все, что я получаю 5 файлов с размерами от 0 и 1 КБ:Lucene.Net создает пустой индекс

 
_0.fdt    0KB 
_0.fdx    0KB 
segment.gen  1KB 
segments_1   1KB 
write.lock   0KB 

У меня есть такая модель, из которой я хочу, чтобы создать индекс:

public class Feed : BaseEntity 
{ 

    public virtual string Address { get; set; } 

    public virtual string Title { get; set; } 

    public virtual string Description { get; set; } 

    public virtual bool IsExported { get; set; } 

    public virtual DateTime LastUpdateTime { get; set; } 

    public virtual int UserId { get; set; } 

    public virtual User User { get; set; } 

    public virtual ICollection<FeedPost> Posts { get; set; } 

    public virtual ICollection<Tag> Tags { get; set; } 

    public virtual Filter Filter { get; set; } 
} 

я реализовал два необходимых интерфейсов из Lucene библиотеки: IIndexDefinition и IResultDefinition:

public class FeedIndexDefinition : IIndexDefinition<Feed> 
{ 
    public Document Convert(Feed entity) 
    { 
     var document = new Document(); 
     document.Add(new Field("id", entity.Id.ToString(), Field.Store.YES, Field.Index.NOT_ANALYZED)); 
     document.Add(new Field("description", entity.Description, Field.Store.YES, Field.Index.ANALYZED)); 
     document.Add(new Field("title", entity.Title, Field.Store.YES, Field.Index.ANALYZED)); 
     return document; 
    } 

    public Term GetIndex(Feed entity) 
    { 
     return new Term("id", entity.Id.ToString()); 
    } 
} 


public class SearchResultDefinition : IResultDefinition<Feed> 
{ 
    public Feed Convert(Document document) 
    { 
     Guid id = Guid.Parse(document.GetValue<String>("id")); 
     var context = new UnitOfWork(); 
     Feed feed = context.FeedRepository.GetById(id); 
     return feed; 
    } 
} 

Индексация осуществляется следующим образом:

private static readonly UnitOfWork Context = new UnitOfWork(); 
    public static void IndexAllFeeds() 
    { 
     var indexWriter = new DirectoryIndexWriter(new DirectoryInfo(IndexPath), true); 
     var feeds = Context.FeedRepository.Get().AsEnumerable(); 
     var indexService = new IndexService(indexWriter); 
     IEnumerable<Feed> array = feeds.ToList(); 
     indexService.IndexWriter.IndexOptions.OptimizeIndex = true; 
     indexService.IndexEntities(array, new FeedIndexDefinition()); 
    } 

А вот метод, который создает запрос для выполнения поиска

public FeedQuery Search(string keywords) 
    { 
     if(!String.IsNullOrEmpty(keywords)) 
     { 
      String[] fields = {"title", "description"}; 
      var parser = new MultiFieldQueryParser(
       Lucene.Net.Util.Version.LUCENE_29, 
       fields, 
       new StandardAnalyzer(Lucene.Net.Util.Version.LUCENE_29)); 
      Query q = parser.Parse(keywords); 
      this.AddQuery(q); 
     } 
     return this; 
    } 

И, наконец, здесь метод в контроллере, который должен найти результаты

private static IEnumerable<Feed> SearchUserFeeds(string keywords) 
    { 
     keywords = "title5 description5 title4 description4 title3 description3"; 
     IEnumerable<Feed> searchResults; 
     var indexSearcher = new DirectoryIndexSearcher(new DirectoryInfo(LuceneHelper.IndexPath)); 
     using (var searchService = new SearchService(indexSearcher)) 
     { 
      var query = new FeedQuery().Search(keywords); 
      searchResults = searchService.SearchIndex(query.Query, new SearchResultDefinition()).Results; 
     } 
     return searchResults; 
    } 

Если кто-то сможет чтобы указать мне на проблему, я буду признателен.

ответ

1

Это нормально, пока ваш IndexWriter не закрыт или не покраснел.

Если это взгляд индекса после закрытия писателя - попытаться изучить индекс с третьим участником Java инструмент под названием lukeall

+0

Но у меня нет какой-либо Flush() из Close() метод в пределах my indexWriter или indexService. – RomanKapitonov

+0

Определенно он имеет Close() и Dispose() –

+0

. Верно. Не заметил прежде. Спасибо за вашу помощь. – RomanKapitonov

Смежные вопросы