/// <summary> /// 更新索引 /// </summary> /// <param name="changeset">实体</param> public void Update(LuceneIndexChangeset changeset) { var 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> /// 检查数据库上下文更改,并返回LuceneIndexChanges类型的集合 /// </summary> /// <returns> LuceneIndexChangeset - 转换为LuceneIndexChanges类型的实体更改集合</returns> private LuceneIndexChangeset GetChangeset() { var changes = new LuceneIndexChangeset(); foreach (var entity in Context.ChangeTracker.Entries().Where(x => x.State != EntityState.Unchanged)) { var entityType = entity.Entity.GetType(); if (!typeof(ILuceneIndexable).IsAssignableFrom(entityType) || entityType.GetMethod("ToDocument") is null) { continue; } var 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); }