2011-12-21 68 views
2

我在我的asp .net mvc應用程序中使用Lucene.Net + SimpleLucene。從數據庫創建索引時出現問題。該指數似乎開始創建好,但我得到的是5檔爲0的大小和1 KB: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沒有關閉或刷新時就沒關係。

如果這是關閉後作家指數的凝視 - 嘗試檢查與命名lukeall

+0

第三方的Java工具的索引,但我沒有),Close()方法中的任何一種同花順(我的indexWriter或indexService對象。 – RomanKapitonov 2011-12-21 11:51:44

+0

當然它有Close()和Dispose() – 2011-12-21 12:37:01

+0

沒錯。沒有先通知。謝謝你的幫助。 – RomanKapitonov 2011-12-21 15:52:09