Beispiel #1
0
        /// <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);
        }
Beispiel #2
0
        /// <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);
        }