/// <summary> /// 7.2 将对象转换Document 对象 /// </summary> /// <param name="entity"></param> /// <returns></returns> public Document ParseEntityToDoc(T entity) { Document doc = new Document(); //通过特性来定义那些字段需要进行分析 foreach (var item in Properties) { DocFieldAttribute fieldAttr = item.GetCustomAttribute <DocFieldAttribute>(); //如果没有说明是Document的字段那么就忽略该字段 if (fieldAttr == null || !fieldAttr.IsDocField) { continue; } //检查该字段是否需要进行分词 AnalyzedAttribute analyzedAttr = item.GetCustomAttribute <AnalyzedAttribute>(); //如果不需要进行分词的情况 //检查该字段的类型,如果是字符串的类型的情况 if (analyzedAttr != null && analyzedAttr.IsAnalyzed) { doc.Add(new Field(item.Name, item.GetValue(entity).ToString(), Field.Store.YES, Field.Index.ANALYZED)); } else { //检查该字段的类型,如果是字符串的类型的情况 if (item.PropertyType == typeof(string) && item.GetValue(entity) != null) { doc.Add(new Field(item.Name, item.GetValue(entity).ToString(), Field.Store.YES, Field.Index.NOT_ANALYZED)); } //如果是数字的情况 else if (item.PropertyType == typeof(decimal) || item.PropertyType == typeof(double) || item.PropertyType == typeof(float) || item.PropertyType == typeof(int) || item.PropertyType == typeof(long)) { bool isDouble = false; double doubleValue = 0; isDouble = Double.TryParse(item.GetValue(entity).ToString(), out doubleValue); if (isDouble) { doc.Add(new NumericField(item.Name, Field.Store.YES, true).SetDoubleValue(doubleValue)); } } } } return(doc); }
/// <summary> /// 创建对象字段的分析器 /// </summary> /// <returns></returns> private PerFieldAnalyzerWrapper CreateAnalyzerWrapper() { Analyzer analyzer = new StandardAnalyzer(Lucene.Net.Util.Version.LUCENE_30); PerFieldAnalyzerWrapper analyzerWrapper = new PerFieldAnalyzerWrapper(analyzer); foreach (var item in Properties) { AnalyzedAttribute attr = item.GetCustomAttribute <AnalyzedAttribute>(); if (attr != null && attr.IsAnalyzed) { analyzerWrapper.AddAnalyzer(item.Name, new PanGuAnalyzer()); } else { analyzerWrapper.AddAnalyzer(item.Name, analyzer); } } return(analyzerWrapper); }