コード例 #1
0
        /// <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);
            }
        }
コード例 #2
0
        /// <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);
        }
コード例 #6
0
        /// <summary>
        /// 更新索引
        /// </summary>
        /// <param name="change">实体</param>
        public void Update(LuceneIndexChange change)
        {
            var changeset = new LuceneIndexChangeset(change);

            Update(changeset);
        }