public static AbstractField CreateField(FieldSearchType field, object value)
        {
            var           s = field.SearchType.Store ? LuceneField.Store.YES : LuceneField.Store.NO;
            AbstractField abstractField;

            switch (field.Field.Type)
            {
            case "byte":
                abstractField = new NumericField(field.Alias, s, field.SearchType.Index).SetIntValue(Convert.ToInt32(value));
                break;

            case "short":
            case "int16":
                abstractField = new NumericField(field.Alias, s, field.SearchType.Index).SetIntValue(Convert.ToInt32(value));
                break;

            case "int":
            case "int32":
                abstractField = new NumericField(field.Alias, s, field.SearchType.Index).SetIntValue((int)value);
                break;

            case "int64":
            case "long":
                abstractField = new NumericField(field.Alias, s, field.SearchType.Index).SetLongValue((long)value);
                break;

            case "double":
                abstractField = new NumericField(field.Alias, s, field.SearchType.Index).SetDoubleValue((double)value);
                break;

            case "decimal":
                abstractField = new LuceneField(field.Alias, ((decimal)value).ToString(LuceneConversion.CalculateDecimalFormat(field.Field.Precision, field.Field.Scale)), s, field.SearchType.Index ? LuceneField.Index.NOT_ANALYZED_NO_NORMS : LuceneField.Index.NO, LuceneField.TermVector.NO);
                break;

            case "float":
            case "single":
                abstractField = new NumericField(field.Alias, s, field.SearchType.Index).SetFloatValue((float)value);
                break;

            case "bool":
            case "boolean":
                abstractField = new LuceneField(field.Alias, (bool)value ? "1" : "0", s, LuceneField.Index.NOT_ANALYZED_NO_NORMS);
                break;

            case "datetime":
                abstractField = new LuceneField(field.Alias, DateTools.DateToString((DateTime)value, DateTools.Resolution.MILLISECOND), s, field.SearchType.Index ? LuceneField.Index.NOT_ANALYZED_NO_NORMS : LuceneField.Index.NO, LuceneField.TermVector.NO);
                break;

            case "rowversion":
            case "byte[]":
                abstractField = field.SearchType.Index ?
                                new LuceneField(field.Alias, Utility.BytesToHexString((byte[])value), s, LuceneField.Index.NOT_ANALYZED_NO_NORMS) :
                                new LuceneField(field.Alias, (byte[])value, s);
                break;

            case "string":
                var iString = field.SearchType.Index ? (
                    field.SearchType.Analyzer.Equals("keyword") ?
                    (field.SearchType.Norms ? LuceneField.Index.NOT_ANALYZED : LuceneField.Index.NOT_ANALYZED_NO_NORMS) :
                    (field.SearchType.Norms ? LuceneField.Index.ANALYZED : LuceneField.Index.ANALYZED_NO_NORMS)
                    ) :
                              LuceneField.Index.NO;

                abstractField = new LuceneField(field.Alias, value.ToString(), s, iString);
                break;

            default:
                var i = field.SearchType.Index ?
                        (field.SearchType.Norms ? LuceneField.Index.NOT_ANALYZED : LuceneField.Index.NOT_ANALYZED_NO_NORMS) :
                        LuceneField.Index.NO;

                abstractField = new LuceneField(field.Alias, value.ToString(), s, i);
                break;
            }
            return(abstractField);
        }