Example #1
0
 protected virtual void ConfigureTextProperty(TextProperty textProperty, IndexDocumentField field, string documentType)
 {
     if (textProperty != null)
     {
         textProperty.Index    = field.IsSearchable;
         textProperty.Analyzer = field.IsSearchable ? SearchableFieldAnalyzerName : null;
     }
 }
Example #2
0
        protected virtual IProperty CreateProviderField(IndexDocumentField field, string documentType)
        {
            var fieldType = field.Value?.GetType() ?? typeof(object);

            if (fieldType == typeof(string))
            {
                if (field.IsFilterable)
                {
                    return(new KeywordProperty());
                }

                return(new TextProperty());
            }

            switch (fieldType.Name)
            {
            case "Int32":
            case "UInt16":
                return(new NumberProperty(NumberType.Integer));

            case "Int16":
            case "Byte":
                return(new NumberProperty(NumberType.Short));

            case "SByte":
                return(new NumberProperty(NumberType.Byte));

            case "Int64":
            case "UInt32":
            case "TimeSpan":
                return(new NumberProperty(NumberType.Long));

            case "Single":
                return(new NumberProperty(NumberType.Float));

            case "Decimal":
            case "Double":
            case "UInt64":
                return(new NumberProperty(NumberType.Double));

            case "DateTime":
            case "DateTimeOffset":
                return(new DateProperty());

            case "Boolean":
                return(new BooleanProperty());

            case "Char":
            case "Guid":
                return(new KeywordProperty());

            case "GeoPoint":
                return(new GeoPointProperty());
            }

            throw new ArgumentException($"Field {field.Name} has unsupported type {fieldType}", nameof(field));
        }
Example #3
0
        protected virtual void ConfigureProperty(IProperty property, IndexDocumentField field, string documentType)
        {
            if (property != null)
            {
                var baseProperty = property as CorePropertyBase;
                if (baseProperty != null)
                {
                    baseProperty.Store = field.IsRetrievable;
                }

                var textProperty = property as TextProperty;
                if (textProperty != null)
                {
                    ConfigureTextProperty(textProperty, field, documentType);
                }

                var keywordProperty = property as KeywordProperty;
                if (keywordProperty != null)
                {
                    ConfigureKeywordProperty(keywordProperty, field, documentType);
                }
            }
        }
Example #4
0
        protected virtual Field CreateProviderField(string documentType, string fieldName, IndexDocumentField field)
        {
            DataType providerFieldType;

            if (field.ValueType == IndexDocumentFieldValueType.Undefined)
            {
                var originalFieldType = field.Value?.GetType() ?? typeof(object);
                providerFieldType = GetProviderFieldType(documentType, fieldName, originalFieldType);
            }
            else
            {
                providerFieldType = GetProviderFieldType(documentType, fieldName, field.ValueType);
            }

            var isGeoPoint   = providerFieldType == DataType.GeographyPoint;
            var isString     = providerFieldType == DataType.String;
            var isCollection = field.IsCollection && isString;

            if (isCollection)
            {
                providerFieldType = DataType.Collection(providerFieldType);
            }

            var providerField = new Field(fieldName, providerFieldType)
            {
                IsKey         = fieldName == AzureSearchHelper.KeyFieldName,
                IsRetrievable = field.IsRetrievable,
                IsSearchable  = isString && field.IsSearchable,
                IsFilterable  = field.IsFilterable,
                IsFacetable   = field.IsFilterable && !isGeoPoint,
                IsSortable    = field.IsFilterable && !isCollection,
            };

            if (providerField.IsSearchable == true)
            {
                providerField.IndexAnalyzer  = ContentAnalyzerName;
                providerField.SearchAnalyzer = AnalyzerName.StandardLucene;
            }

            return(providerField);
        }
Example #5
0
        protected virtual Field AddProviderField(string documentType, IList <Field> providerFields, string fieldName, IndexDocumentField field)
        {
            var providerField = providerFields?.FirstOrDefault(f => f.Name == fieldName);

            if (providerField == null)
            {
                providerField = CreateProviderField(documentType, fieldName, field);
                providerFields?.Add(providerField);
            }

            return(providerField);
        }
Example #6
0
        protected virtual IList <IIndexableField> ConvertToProviderFields(IndexDocumentField field)
        {
            // TODO: Introduce and use metadata describing value type

            var result = new List <IIndexableField>();

            var fieldName = LuceneSearchHelper.ToLuceneFieldName(field.Name);
            var store     = field.IsRetrievable ? Field.Store.YES : Field.Store.NO;

            //var index = field.IsSearchable ? Field.Index.ANALYZED : field.IsFilterable ? Field.Index.NOT_ANALYZED : Field.Index.NO;

            if (field.Value is string)
            {
                foreach (var value in field.Values)
                {
                    result.Add(new StringField(fieldName, (string)value, store));

                    if (field.IsSearchable)
                    {
                        result.Add(new StringField(LuceneSearchHelper.SearchableFieldName, (string)value, Field.Store.NO));
                    }
                }
            }
            else if (field.Value is bool)
            {
                var booleanFieldName = LuceneSearchHelper.GetBooleanFieldName(field.Name);

                foreach (var value in field.Values)
                {
                    var stringValue = value.ToStringInvariant();
                    result.Add(new StringField(fieldName, stringValue, store));
                    result.Add(new StringField(booleanFieldName, stringValue, Field.Store.NO));
                }
            }
            else if (field.Value is DateTime)
            {
                var dateTimeFieldName = LuceneSearchHelper.GetDateTimeFieldName(field.Name);

                foreach (var value in field.Values)
                {
                    //TODO
                    //var numericField = new NumericField(fieldName, store, index != Field.Index.NO);
                    //numericField.SetLongValue(((DateTime)value).Ticks);
                    //result.Add(numericField);
                    result.Add(new StringField(dateTimeFieldName, value.ToStringInvariant(), Field.Store.NO));
                }
            }
            else if (field.Value is GeoPoint)
            {
                var geoPoint = (GeoPoint)field.Value;

                result.Add(new StringField(fieldName, geoPoint.ToString(), Field.Store.YES));

                var shape    = _spatialContext.MakePoint(geoPoint.Longitude, geoPoint.Latitude);
                var strategy = new PointVectorStrategy(_spatialContext, fieldName);

                foreach (var f in strategy.CreateIndexableFields(shape))
                {
                    result.Add(f);
                }
            }
            else
            {
                double t;
                if (double.TryParse(field.Value.ToStringInvariant(), NumberStyles.Float, CultureInfo.InvariantCulture, out t))
                {
                    var facetableFieldName = LuceneSearchHelper.GetFacetableFieldName(field.Name);

                    foreach (var value in field.Values)
                    {
                        var stringValue = value.ToStringInvariant();

                        //TODO
                        //var numericField = new NumericField(fieldName, store, index != Field.Index.NO);
                        //numericField.SetDoubleValue(double.Parse(stringValue, NumberStyles.Float, CultureInfo.InvariantCulture));
                        //result.Add(numericField);

                        result.Add(new StringField(facetableFieldName, stringValue, Field.Store.NO));
                    }
                }
                else
                {
                    result.AddRange(field.Values.Select(value => new StringField(fieldName, value.ToStringInvariant(), store)));
                }
            }

            return(result);
        }
Example #7
0
 protected virtual void ConfigureKeywordProperty(KeywordProperty keywordProperty, IndexDocumentField field, string documentType)
 {
     if (keywordProperty != null)
     {
         keywordProperty.Index = field.IsFilterable;
     }
 }
        protected virtual IList <IIndexableField> ConvertToProviderFields(IndexDocumentField field)
        {
            var result = new List <IIndexableField>();

            var fieldName = LuceneSearchHelper.ToLuceneFieldName(field.Name);
            var store     = field.IsRetrievable ? Field.Store.YES : Field.Store.NO;

            switch (field.Value)
            {
            case string _:
                foreach (var value in field.Values)
                {
                    result.Add(new StringField(fieldName, (string)value, store));

                    if (field.IsSearchable)
                    {
                        result.Add(new StringField(LuceneSearchHelper.SearchableFieldName, (string)value, Field.Store.NO));
                    }
                }
                break;

            case bool _:
                var booleanFieldName = LuceneSearchHelper.GetBooleanFieldName(field.Name);

                foreach (var value in field.Values)
                {
                    var stringValue = value.ToStringInvariant();
                    result.Add(new StringField(fieldName, stringValue, store));
                    result.Add(new StringField(booleanFieldName, stringValue, Field.Store.NO));
                }
                break;

            case DateTime _:
                var dateTimeFieldName = LuceneSearchHelper.GetDateTimeFieldName(field.Name);

                foreach (var value in field.Values)
                {
                    var numericField = new Int64Field(fieldName, ((DateTime)value).Ticks, store);
                    result.Add(numericField);
                    result.Add(new StringField(dateTimeFieldName, value.ToStringInvariant(), Field.Store.NO));
                }
                break;

            case GeoPoint _:
                var geoPoint = (GeoPoint)field.Value;

                result.Add(new StringField(fieldName, geoPoint.ToString(), Field.Store.YES));

                var shape    = _spatialContext.MakePoint(geoPoint.Longitude, geoPoint.Latitude);
                var strategy = new PointVectorStrategy(_spatialContext, fieldName);

                result.AddRange(strategy.CreateIndexableFields(shape));
                break;

            default:
                if (double.TryParse(field.Value.ToStringInvariant(), NumberStyles.Float, CultureInfo.InvariantCulture, out _))
                {
                    var facetableFieldName = LuceneSearchHelper.GetFacetableFieldName(field.Name);

                    foreach (var value in field.Values)
                    {
                        var stringValue = value.ToStringInvariant();

                        var doubleField = new DoubleField(fieldName, double.Parse(stringValue, NumberStyles.Float, CultureInfo.InvariantCulture), store);

                        result.Add(doubleField);

                        result.Add(new StringField(facetableFieldName, stringValue, Field.Store.NO));
                    }
                }
                else
                {
                    result.AddRange(field.Values.Select(value => new StringField(fieldName, value.ToStringInvariant(), store)));
                }
                break;
            }

            return(result);
        }