2021-09-27 18:08:36 版本 : 基于Lucene.Net构建.NET Core版搜索引擎(三)--泛型扩展及为实体创建索引
作者: 潘帅 于 2021年09月27日 发布在分类 / 人防组 / 人防后端 下,并于 2021年09月27日 编辑
 历史版本

修改日期 修改人 备注
2021-09-30 08:57:58[当前版本] 潘帅 1.1
2021-09-27 21:12:51 潘帅 1.1
2021-09-27 18:08:36 潘帅 1.0


1.泛型扩展


1.1.公共属性提取

        /// <summary>
        /// 分析器
        /// </summary>
        public Analyzer Analyzer { get; set; }
        /// <summary>
        /// 存储
        /// </summary>
        public Directory Directory { get; set; }
公共属性提取后


        public SearchManager(TDirectory directory, TAnalyzer analyzer)
        {
            Directory = directory;
            Analyzer = analyzer;
            IndexConfig = new IndexWriterConfig(LuceneVersion.LUCENE_48, analyzer);
        }

        #region 创建索引
        /// <summary>
        /// 创建索引
        /// </summary>
        /// <param name="fields">Field域集合,也可以是其他结构</param>
        public virtual void CreateIndex(Dictionary<string, string> fields)
        {
            using (IndexWriter writer = new IndexWriter(Directory, IndexConfig))
            {
                //创建文档
                Document doc = new Document();
                foreach (var field in fields)
                {
                    //创建数据域。此处使用了StringField域。此外还能用Int32Field、DoubleField等。
                    //StringField:将字段索引,但不会进行分词。
                    //TextField:将字段分词后进行索引
                    Field f = new TextField(field.Key, field.Value, Field.Store.YES);
                    //添加数据域至文档
                    doc.Add(f);
                }
                //索引操作器增加文档
                writer.AddDocument(doc);
                //刷新索引
                writer.Flush(true, true);
                writer.Commit();
            }
        }
        #endregion


1.2.扩展为泛型方法


    public interface ISearchManager<TAnalyzer,TDirectory> where TAnalyzer:Analyzer where TDirectory:Directory
    {
        /// <summary>
        /// 分析器
        /// </summary>
        TAnalyzer Analyzer { get; set; }
        /// <summary>
        /// 存储
        /// </summary>
        TDirectory Directory { get; set; }

        /// <summary>
        /// 创建索引
        /// </summary>
        /// <param name="fields"></param>
        void CreateIndex(Dictionary<string, string> fields);

        /// <summary>
        /// 删除索引
        /// </summary>
        /// <param name="docId">文档</param>
        void DeleteIndex(int docId);

        /// <summary>
        /// 删除所有索引
        /// </summary>
        void DeleteAllIndex();

        /// <summary>
        /// 更新索引
        /// </summary>
        /// <param name="doc">文档</param>
        /// <param name="dic">要更新的域</param>
        void UpdateIndex(Document doc, Dictionary<string, string> dic);

        /// <summary>
        /// 索引计数
        /// </summary>
        /// <returns></returns>
        int CountIndex();

        /// <summary>
        /// 关键词查询
        /// </summary>
        /// <param name="keyword"></param>
        /// <param name="field"></param>
        /// <returns></returns>
        Dictionary<Document, float> SearchIndex(string keyword, string field);

        /// <summary>
        /// 为实体对象创建索引
        /// </summary>
        /// <param name="entity"></param>
        void CreateIndexByEntity(IEntity<string> entity);

    }
    public interface ISearchManager:ISearchManager<Analyzer,Directory>
    {

    }


2.为实体创建索引


2.1.创建索引(实体)方法

        /// <summary>
        /// 为实体创建索引
        /// </summary>
        /// <param name="entity"></param>
        public virtual void CreateIndexByEntity(IEntity<string> entity)
        {
            using (IndexWriter writer = new IndexWriter(Directory, IndexConfig))
            {
                //创建文档
                Document doc = new Document();

                var type = entity.GetType();
                var properties = type.GetProperties();
                foreach (var propertyInfo in properties)
                {
                    var propertyValue = propertyInfo.GetValue(this);
                    if (propertyValue==null)
                    {
                        continue;
                    }

                    string fieldName = propertyInfo.Name;
                    switch (propertyValue)
                    {
                        case DateTime time: 
                            doc.Add(new StringField(fieldName,time.ToString("yyyy-MM-dd HH:mm:ss"),Field.Store.YES));
                            break;
                        case int num:
                            doc.Add(new Int32Field(fieldName,num,Field.Store.YES));
                            break;
                        case long num:
                            doc.Add(new Int64Field(fieldName,num,Field.Store.YES));
                            break;
                        case double num:
                            doc.Add(new DoubleField(fieldName,num,Field.Store.YES));
                            break;
                        default:
                            doc.Add(new TextField(fieldName, propertyValue.ToString(),Field.Store.YES));
                            break;
                    }
                }

                writer.AddDocument(doc);
                //刷新索引
                writer.Flush(true, true);
                writer.Commit();
            }
        }

2.2.索引属性标识

    [AttributeUsage(AttributeTargets.Property)]
    public class IndexAttribute:Attribute
    {
        public IndexAttribute()
        {
            IsStore = Field.Store.YES;
            FieldType = FieldDataType.Text;
        }

        /// <summary>
        /// 名称
        /// </summary>
        public string FieldName { get; set; }
        /// <summary>
        /// 是否存储
        /// </summary>
        public Field.Store IsStore { get; set; }
        /// <summary>
        /// 数据格式
        /// </summary>
        public FieldDataType FieldType { get; set; }
    }


历史版本-目录  [回到顶端]
    知识分享平台 -V 4.8.7 -wcp