protected virtual void ConfigureTextProperty(TextProperty textProperty, IndexDocumentField field, string documentType) { if (textProperty != null) { textProperty.Index = field.IsSearchable; textProperty.Analyzer = field.IsSearchable ? SearchableFieldAnalyzerName : null; } }
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)); }
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); } } }
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); }
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); }
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); }
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); }