/// <summary> /// 更新索引 /// </summary> /// <param name="changeset">实体</param> public void Update(LuceneIndexChangeset changeset) { IndexWriterConfig config = new IndexWriterConfig(Lucene.Net.Util.LuceneVersion.LUCENE_48, _analyzer); using (var writer = new IndexWriter(_directory, config)) { foreach (var change in changeset.Entries) { switch (change.State) { case LuceneIndexState.Added: writer.AddDocument(change.Entity.ToDocument()); break; case LuceneIndexState.Removed: writer.DeleteDocuments(new Term("IndexId", change.Entity.IndexId)); break; case LuceneIndexState.Updated: writer.UpdateDocument(new Term("IndexId", change.Entity.IndexId), change.Entity.ToDocument()); break; } } writer.Flush(true, changeset.HasDeletes); } }
/// <summary> /// 删除索引 /// </summary> /// <param name="entries">实体集</param> public void Delete <T>(List <T> entries) where T : ILuceneIndexable { var set = new LuceneIndexChangeset { Entries = entries.Select(e => new LuceneIndexChange(e, LuceneIndexState.Removed)).ToList() }; Update(set); }
/// <summary> /// 保存数据更改并同步索引 /// </summary> /// <returns></returns> public int SaveChanges(bool index = true) { int result = 0; if (Context.ChangeTracker.HasChanges()) { // 获取要变更的实体集 LuceneIndexChangeset changes = GetChangeset(); result = Context.SaveChanges(); if (changes.HasChanges && index) { LuceneIndexer.Update(changes); } } return(result); }
/// <summary> /// 保存数据更改并同步索引 /// </summary> /// <param name="index">是否需要被重新索引</param> /// <returns></returns> public async Task <int> SaveChangesAsync(bool index = true) { int result = 0; if (Context.ChangeTracker.HasChanges()) { // 获取要变更的结果集 LuceneIndexChangeset changes = GetChangeset(); result = await Context.SaveChangesAsync(); if (changes.HasChanges && index) { LuceneIndexer.Update(changes); } } return(result); }
///// <summary> ///// 初始化索引库 ///// </summary> ///// <param name="options"></param> //private void InitializeLucene(LuceneIndexerOptions options) //{ // if (_directory == null) // { // _directory = FSDirectory.Open(options.Path); // } // _analyzer = new JieBaAnalyzer(TokenizerMode.Search); // LuceneIndexer = new LuceneIndexer(_directory, _analyzer); // LuceneIndexSearcher = new LuceneIndexSearcher(_directory, _analyzer, _memoryCache); //} /// <summary> /// 检查数据库上下文更改,并返回LuceneIndexChanges类型的集合 /// </summary> /// <returns> LuceneIndexChangeset - 转换为LuceneIndexChanges类型的实体更改集合</returns> private LuceneIndexChangeset GetChangeset() { LuceneIndexChangeset changes = new LuceneIndexChangeset(); foreach (var entity in Context.ChangeTracker.Entries().Where(x => x.State != EntityState.Unchanged)) { Type entityType = entity.Entity.GetType(); bool implementsILuceneIndexable = typeof(ILuceneIndexable).IsAssignableFrom(entityType); if (implementsILuceneIndexable) { MethodInfo method = entityType.GetMethod("ToDocument"); if (method != null) { LuceneIndexChange change = new LuceneIndexChange(entity.Entity as ILuceneIndexable); switch (entity.State) { case EntityState.Added: change.State = LuceneIndexState.Added; break; case EntityState.Deleted: change.State = LuceneIndexState.Removed; break; case EntityState.Modified: change.State = LuceneIndexState.Updated; break; default: change.State = LuceneIndexState.Unchanged; break; } changes.Entries.Add(change); } } } return(changes); }
/// <summary> /// 更新索引 /// </summary> /// <param name="change">实体</param> public void Update(LuceneIndexChange change) { var changeset = new LuceneIndexChangeset(change); Update(changeset); }