修改日期 | 修改人 | 备注 |
2021-09-30 08:57:58[当前版本] | 潘帅 | 1.1 |
2021-09-27 21:12:51 | 潘帅 | 1.1 |
2021-09-27 18:08:36 | 潘帅 | 1.0 |
/// <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
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> { }
/// <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(); } }
[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; } }