public override AbstractField[] CreateIndexableFields(Shape shape) { var point = shape as Point; if (point != null) { var f = new AbstractField[2]; var f0 = new NumericField(fieldNameX, precisionStep, Field.Store.NO, true) {OmitNorms = true, OmitTermFreqAndPositions = true}; f0.SetDoubleValue(point.GetX()); f[0] = f0; var f1 = new NumericField(fieldNameY, precisionStep, Field.Store.NO, true) {OmitNorms = true, OmitTermFreqAndPositions = true}; f1.SetDoubleValue(point.GetY()); f[1] = f1; return f; } if (!ignoreIncompatibleGeometry) { throw new ArgumentException("TwoDoublesStrategy can not index: " + shape); } return new AbstractField[0]; // nothing (solr does not support null) }
public IFieldable CreateLuceneField(string fieldName, object fieldValue) { if (!Numeric) { return new Field(fieldName, LuceneUtility.ToFieldStringValue(fieldValue), Store, Index) { Boost = Boost }; } var field = new NumericField(fieldName, Store, Index != Field.Index.NO) { Boost = Boost }; if (fieldValue is Int32) { field.SetIntValue((int)fieldValue); } else if (fieldValue is Int64) { field.SetLongValue((long)fieldValue); } else if (fieldValue is Single) { field.SetFloatValue((float)fieldValue); } else if (fieldValue is Double) { field.SetDoubleValue((double)fieldValue); } else if (fieldValue is Decimal) { field.SetDoubleValue((double)(decimal)fieldValue); } else { throw new NotSupportedException(); } return field; }
private static Document CloneDocument(Document luceneDoc) { var clonedDocument = new Document(); foreach (AbstractField field in luceneDoc.GetFields()) { var numericField = field as NumericField; if (numericField != null) { var clonedNumericField = new NumericField(numericField.Name, numericField.IsStored ? Field.Store.YES : Field.Store.NO, numericField.IsIndexed); var numericValue = numericField.NumericValue; if (numericValue is int) { clonedNumericField.SetIntValue((int)numericValue); } else if (numericValue is long) { clonedNumericField.SetLongValue((long)numericValue); } else if (numericValue is double) { clonedNumericField.SetDoubleValue((double)numericValue); } else if (numericValue is float) { clonedNumericField.SetFloatValue((float)numericValue); } clonedDocument.Add(clonedNumericField); } else { Field clonedField; if (field.IsBinary) { clonedField = new Field(field.Name, field.GetBinaryValue(), field.IsStored ? Field.Store.YES : Field.Store.NO); } else if (field.StringValue != null) { clonedField = new Field(field.Name, field.StringValue, field.IsStored ? Field.Store.YES : Field.Store.NO, field.IsIndexed ? Field.Index.ANALYZED_NO_NORMS : Field.Index.NOT_ANALYZED_NO_NORMS, field.IsTermVectorStored ? Field.TermVector.YES : Field.TermVector.NO); } else { //probably token stream, and we can't handle fields with token streams, so we skip this. continue; } clonedDocument.Add(clonedField); } } return clonedDocument; }
/// <summary> /// This method generate the fields for indexing documents in lucene from the values. /// Given a name and a value, it has the following behavior: /// * If the value is enumerable, index all the items in the enumerable under the same field name /// * If the value is null, create a single field with the supplied name with the unanalyzed value 'NULL_VALUE' /// * If the value is string or was set to not analyzed, create a single field with the supplied name /// * If the value is date, create a single field with millisecond precision with the supplied name /// * If the value is numeric (int, long, double, decimal, or float) will create two fields: /// 1. with the supplied name, containing the numeric value as an unanalyzed string - useful for direct queries /// 2. with the name: name +'_Range', containing the numeric value in a form that allows range queries /// </summary> private static IEnumerable<AbstractField> CreateFields(string name, object value, IndexDefinition indexDefinition, Field.Store defaultStorage) { if(string.IsNullOrWhiteSpace(name)) throw new ArgumentException("Field must be not null, not empty and cannot contain whitespace", "name"); if (char.IsLetter(name[0]) == false && name[0] != '_') { name = "_" + name; } if (value == null) { yield return new Field(name, Constants.NullValue, indexDefinition.GetStorage(name, defaultStorage), Field.Index.NOT_ANALYZED); yield break; } if (value is DynamicNullObject) { if(((DynamicNullObject)value ).IsExplicitNull) { yield return new Field(name, Constants.NullValue, indexDefinition.GetStorage(name, defaultStorage), Field.Index.NOT_ANALYZED); } yield break; } if(value is AbstractField) { yield return (AbstractField)value; yield break; } var itemsToIndex = value as IEnumerable; if( itemsToIndex != null && ShouldTreatAsEnumerable(itemsToIndex)) { yield return new Field(name + "_IsArray", "true", Field.Store.YES, Field.Index.NOT_ANALYZED_NO_NORMS); foreach (var itemToIndex in itemsToIndex) { foreach (var field in CreateFields(name, itemToIndex, indexDefinition, defaultStorage)) { yield return field; } } yield break; } if (indexDefinition.GetIndex(name, null) == Field.Index.NOT_ANALYZED)// explicitly not analyzed { yield return new Field(name, value.ToString(), indexDefinition.GetStorage(name, defaultStorage), indexDefinition.GetIndex(name, Field.Index.NOT_ANALYZED)); yield break; } if (value is string) { var index = indexDefinition.GetIndex(name, Field.Index.ANALYZED); yield return new Field(name, value.ToString(), indexDefinition.GetStorage(name, defaultStorage), index); yield break; } if (value is DateTime) { yield return new Field(name, DateTools.DateToString((DateTime)value, DateTools.Resolution.MILLISECOND), indexDefinition.GetStorage(name, defaultStorage), indexDefinition.GetIndex(name, Field.Index.NOT_ANALYZED)); } else if(value is bool) { yield return new Field(name, ((bool) value) ? "true" : "false", indexDefinition.GetStorage(name, defaultStorage), indexDefinition.GetIndex(name, Field.Index.NOT_ANALYZED)); } else if(value is IConvertible) // we need this to store numbers in invariant format, so JSON could read them { var convert = ((IConvertible) value); yield return new Field(name, convert.ToString(CultureInfo.InvariantCulture), indexDefinition.GetStorage(name, defaultStorage), indexDefinition.GetIndex(name, Field.Index.NOT_ANALYZED)); } else if (value is DynamicJsonObject) { var inner = ((DynamicJsonObject)value).Inner; yield return new Field(name + "_ConvertToJson", "true", Field.Store.YES, Field.Index.NOT_ANALYZED_NO_NORMS); yield return new Field(name, inner.ToString(), indexDefinition.GetStorage(name, defaultStorage), indexDefinition.GetIndex(name, Field.Index.NOT_ANALYZED)); } else { yield return new Field(name + "_ConvertToJson", "true", Field.Store.YES, Field.Index.NOT_ANALYZED_NO_NORMS); yield return new Field(name, JToken.FromObject(value).ToString(), indexDefinition.GetStorage(name, defaultStorage), indexDefinition.GetIndex(name, Field.Index.NOT_ANALYZED)); } var numericField = new NumericField(name + "_Range", indexDefinition.GetStorage(name, defaultStorage), true); if (value is int) { if(indexDefinition.GetSortOption(name) == SortOptions.Long) yield return numericField.SetLongValue((int)value); else yield return numericField.SetIntValue((int)value); } if (value is long) { yield return numericField .SetLongValue((long) value); } if (value is decimal) { yield return numericField .SetDoubleValue((double)(decimal)value); } if (value is float) { if (indexDefinition.GetSortOption(name) == SortOptions.Double) yield return numericField.SetDoubleValue((float)value); else yield return numericField.SetFloatValue((float) value); } if (value is double) { yield return numericField .SetDoubleValue((double)value); } }
private static Document CloneDocument(Document luceneDoc) { var clonedDocument = new Document(); foreach (AbstractField field in luceneDoc.GetFields()) { var numericField = field as NumericField; if (numericField != null) { var clonedNumericField = new NumericField(numericField.Name(), numericField.IsStored() ? Field.Store.YES : Field.Store.NO, numericField.IsIndexed()); var numericValue = numericField.GetNumericValue(); if (numericValue is int) { clonedNumericField.SetIntValue((int)numericValue); } if (numericValue is long) { clonedNumericField.SetLongValue((long)numericValue); } if (numericValue is double) { clonedNumericField.SetDoubleValue((double)numericValue); } if (numericValue is float) { clonedNumericField.SetFloatValue((float)numericValue); } clonedDocument.Add(clonedNumericField); } else { var clonedField = new Field(field.Name(), field.BinaryValue(), field.IsStored() ? Field.Store.YES : Field.Store.NO); clonedDocument.Add(clonedField); } } return clonedDocument; }
private static Document CloneDocument(Document luceneDoc) { var clonedDocument = new Document(); foreach (AbstractField field in luceneDoc.GetFields()) { var numericField = field as NumericField; if (numericField != null) { var clonedNumericField = new NumericField(numericField.Name, numericField.IsStored ? Field.Store.YES : Field.Store.NO, numericField.IsIndexed); var numericValue = numericField.NumericValue; if (numericValue is int) { clonedNumericField.SetIntValue((int)numericValue); } else if (numericValue is long) { clonedNumericField.SetLongValue((long)numericValue); } else if (numericValue is double) { clonedNumericField.SetDoubleValue((double)numericValue); } else if (numericValue is float) { clonedNumericField.SetFloatValue((float)numericValue); } clonedDocument.Add(clonedNumericField); } else { Field clonedField; if (field.IsBinary) { clonedField = new Field(field.Name, field.GetBinaryValue(), field.IsStored ? Field.Store.YES : Field.Store.NO); } else { clonedField = new Field(field.Name, field.StringValue, field.IsStored ? Field.Store.YES : Field.Store.NO, field.IsIndexed ? Field.Index.ANALYZED_NO_NORMS : Field.Index.NOT_ANALYZED_NO_NORMS); } clonedDocument.Add(clonedField); } } return clonedDocument; }
/// <summary> /// This method generate the fields for indexing documents in lucene from the values. /// Given a name and a value, it has the following behavior: /// * If the value is null, create a single field with the supplied name with the unanalyzed value 'NULL_VALUE' /// * If the value is string or was set to not analyzed, create a single field with the supplied name /// * If the value is date, create a single field with millisecond precision with the supplied name /// * If the value is numeric (int, long, double, decimal, or float) will create two fields: /// 1. with the supplied name, containing the numeric value as an unanalyzed string - useful for direct queries /// 2. with the name: name +'_Range', containing the numeric value in a form that allows range queries /// </summary> private static IEnumerable<AbstractField> CreateFields(string name, object value, IndexDefinition indexDefinition, Field.Store defaultStorage) { if (value == null) { yield return new Field(name, "NULL_VALUE", indexDefinition.GetStorage(name, defaultStorage), Field.Index.NOT_ANALYZED); yield break; } var fields = value as IEnumerable<AbstractField>; if(fields != null) { foreach (var field in fields) { yield return field; } yield break; } if (indexDefinition.GetIndex(name, null) == Field.Index.NOT_ANALYZED)// explicitly not analyzed { yield return new Field(name, value.ToString(), indexDefinition.GetStorage(name, defaultStorage), indexDefinition.GetIndex(name, Field.Index.NOT_ANALYZED)); yield break; } if (value is string) { var index = indexDefinition.GetIndex(name, Field.Index.ANALYZED); yield return new Field(name, value.ToString(), indexDefinition.GetStorage(name, defaultStorage), index); yield break; } if (value is DateTime) { yield return new Field(name, DateTools.DateToString((DateTime)value, DateTools.Resolution.MILLISECOND), indexDefinition.GetStorage(name, defaultStorage), indexDefinition.GetIndex(name, Field.Index.NOT_ANALYZED)); } else if(value is bool) { yield return new Field(name, ((bool) value) ? "true" : "false", indexDefinition.GetStorage(name, defaultStorage), indexDefinition.GetIndex(name, Field.Index.NOT_ANALYZED)); } else if(value is IConvertible) // we need this to store numbers in invariant format, so JSON could read them { var convert = ((IConvertible) value); yield return new Field(name, convert.ToString(CultureInfo.InvariantCulture), indexDefinition.GetStorage(name, defaultStorage), indexDefinition.GetIndex(name, Field.Index.NOT_ANALYZED)); } else if (value is DynamicJsonObject) { var inner = ((DynamicJsonObject)value).Inner; yield return new Field(name + "_ConvertToJson", "true", Field.Store.YES, Field.Index.NOT_ANALYZED_NO_NORMS); yield return new Field(name, inner.ToString(), indexDefinition.GetStorage(name, defaultStorage), indexDefinition.GetIndex(name, Field.Index.NOT_ANALYZED)); } else { yield return new Field(name + "_ConvertToJson", "true", Field.Store.YES, Field.Index.NOT_ANALYZED_NO_NORMS); yield return new Field(name, JToken.FromObject(value).ToString(), indexDefinition.GetStorage(name, defaultStorage), indexDefinition.GetIndex(name, Field.Index.NOT_ANALYZED)); } var numericField = new NumericField(name + "_Range", indexDefinition.GetStorage(name, defaultStorage), true); if (value is int) { if(indexDefinition.GetSortOption(name) == SortOptions.Long) yield return numericField.SetLongValue((int)value); else yield return numericField.SetIntValue((int)value); } if (value is long) { yield return numericField .SetLongValue((long) value); } if (value is decimal) { yield return numericField .SetDoubleValue((double)(decimal)value); } if (value is float) { if (indexDefinition.GetSortOption(name) == SortOptions.Double) yield return numericField.SetDoubleValue((float)value); else yield return numericField.SetFloatValue((float) value); } if (value is double) { yield return numericField .SetDoubleValue((double)value); } }
public AbstractField[] CreateIndexableFields(Point point) { var f = new AbstractField[2]; var f0 = new NumericField(fieldNameX, precisionStep, Field.Store.NO, true) {OmitNorms = true, OmitTermFreqAndPositions = true}; f0.SetDoubleValue(point.GetX()); f[0] = f0; var f1 = new NumericField(fieldNameY, precisionStep, Field.Store.NO, true) {OmitNorms = true, OmitTermFreqAndPositions = true}; f1.SetDoubleValue(point.GetY()); f[1] = f1; return f; }
private AbstractField DoubleField(string field, double value) { var f = new NumericField(field, precisionStep, Field.Store.NO, true) {OmitNorms = true, OmitTermFreqAndPositions = true}; f.SetDoubleValue(value); return f; }
private static AbstractField CreateField(IndexFieldInfo fieldInfo) { NumericField nf; switch (fieldInfo.Type) { case FieldInfoType.StringField: return new Field(fieldInfo.Name, fieldInfo.Value, fieldInfo.Store, fieldInfo.Index, fieldInfo.TermVector); case FieldInfoType.IntField: nf = new NumericField(fieldInfo.Name, fieldInfo.Store, fieldInfo.Index != Field.Index.NO); nf.SetIntValue(Int32.Parse(fieldInfo.Value, CultureInfo.InvariantCulture)); return nf; case FieldInfoType.LongField: nf = new NumericField(fieldInfo.Name, 8, fieldInfo.Store, fieldInfo.Index != Field.Index.NO); nf.SetLongValue(Int64.Parse(fieldInfo.Value, CultureInfo.InvariantCulture)); return nf; case FieldInfoType.SingleField: nf = new NumericField(fieldInfo.Name, fieldInfo.Store, fieldInfo.Index != Field.Index.NO); nf.SetFloatValue(Single.Parse(fieldInfo.Value, CultureInfo.InvariantCulture)); return nf; case FieldInfoType.DoubleField: nf = new NumericField(fieldInfo.Name, 8, fieldInfo.Store, fieldInfo.Index != Field.Index.NO); nf.SetDoubleValue(Double.Parse(fieldInfo.Value, CultureInfo.InvariantCulture)); return nf; default: throw new NotImplementedException("IndexFieldInfo." + fieldInfo.Type); } }
private static AbstractField CreateNumericField(FieldMapping mapping, ValueType value, string fieldName) { NumericField numField = new NumericField( fieldName, DefaultPrecisionStep, mapping.Store, mapping.Index != Field.Index.NO); if (value is int) numField.SetIntValue((int)value); else if (value is long) numField.SetLongValue((long)value); else if (value is float) numField.SetFloatValue((float)value); else if (value is double) numField.SetDoubleValue((double)value); else if (value is decimal) numField.SetDoubleValue((double)(decimal)value); else if (value is DateTime) numField.SetLongValue(((DateTime)value).ToBinary()); else throw new Exception(String.Format(Properties.Resources.EXC_TYPE_NOT_SUPPORTED, value)); return numField; }
public Document ObterDocumento(int id, string tipoImovel, string bairro = "Bela Vista", string cidade = "São Paulo", string estado = "SP", double preco = 200) { var documento = new Document(); documento.Add(new Field(Id, id.ToString(), Field.Store.YES, Field.Index.NOT_ANALYZED)); documento.Add(new Field(TipoImovel, tipoImovel, Field.Store.YES, Field.Index.ANALYZED)); documento.Add(new Field(Bairro, bairro, Field.Store.YES, Field.Index.ANALYZED)); documento.Add(new Field(Cidade, cidade, Field.Store.YES, Field.Index.ANALYZED)); documento.Add(new Field(Estado, estado, Field.Store.YES, Field.Index.ANALYZED)); documento.Add(new Field(Descricao, String.Format("Imovel {0} Bairro {1} Cidade {2} Estado {3} Preço Preco {4}", tipoImovel, bairro, cidade, estado, preco), Field.Store.YES, Field.Index.ANALYZED)); var campoPreco = new NumericField(Preco); campoPreco.SetDoubleValue(preco); documento.Add(campoPreco); var referencia = new NumericField(Referencia); referencia.SetLongValue(id); documento.Add(referencia); return documento; }
/// <summary> /// Adds the field to the lucene document. /// </summary> /// <param name="doc">The doc.</param> /// <param name="field">The field.</param> private static void AddFieldToDocument(ref Document doc, IDocumentField field) { if (field == null) { return; } var store = Field.Store.YES; var index = Field.Index.NOT_ANALYZED; if (field.ContainsAttribute(IndexStore.No)) { store = Field.Store.NO; } if (field.ContainsAttribute(IndexType.Analyzed)) { index = Field.Index.ANALYZED; } else if (field.ContainsAttribute(IndexType.No)) { index = Field.Index.NO; } if (field.Value == null) { return; } field.Name = field.Name.ToLower(); if (field.Name == "__key") { foreach (var val in field.Values) { doc.Add(new Field(field.Name, val.ToString(), store, index)); } } else if (field.Value is string) { foreach (var val in field.Values) { doc.Add(new Field(field.Name, val.ToString(), store, index)); doc.Add(new Field("_content", val.ToString(), Field.Store.NO, Field.Index.ANALYZED)); } } else if (field.Value is decimal) // parse prices { foreach (var val in field.Values) { var numericField = new NumericField(field.Name, store, index != Field.Index.NO); numericField.SetDoubleValue(double.Parse(val.ToString())); doc.Add(numericField); } } else if (field.Value is DateTime) // parse dates { foreach (var val in field.Values) { doc.Add( new Field( field.Name, DateTools.DateToString((DateTime)val, DateTools.Resolution.SECOND), store, index)); } } else // try detecting the type { // TODO: instead of auto detecting, use meta data information decimal t; if (Decimal.TryParse(field.Value.ToString(), out t)) { foreach (var val in field.Values) { var numericField = new NumericField(field.Name, store, index != Field.Index.NO); numericField.SetDoubleValue(double.Parse(val.ToString())); doc.Add(numericField); } } else { foreach (var val in field.Values) { doc.Add(new Field(field.Name, val.ToString(), store, index)); } } } }