private static Filter CreateTermFilter(TermFilter termFilter, ICollection <string> availableFields) { Filter result = null; if (termFilter?.FieldName != null && termFilter.Values != null) { var isBooleanField = availableFields.Contains(LuceneSearchHelper.GetBooleanFieldName(termFilter.FieldName)); var values = termFilter.Values.Select(v => GetFilterValue(v, isBooleanField)).ToArray(); var fieldName = LuceneSearchHelper.ToLuceneFieldName(termFilter.FieldName); result = CreateTermsFilter(fieldName, values); } return(result); }
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 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); }