private static void AddNumericPublishedDate(Document document, DateTime publishedDate) { var publishedDateString = publishedDate.ToString("yyyyMMddhhmmss"); var publishedDateNumeric = new NumericField(PublishedDateNumericField, Field.Store.YES, true); publishedDateNumeric.SetLongValue(long.Parse(publishedDateString)); document.Add(publishedDateNumeric); }
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 void AddDocumentTimeStampField() { var numField = new NumericField(TimeStampFieldName, Field.Store.YES, true); numField.SetLongValue(_searchableObject.Timestamp.ToFileTime()); _document.Add(numField); }
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 Document CreateDocument(App app) { Document doc = new Document(); Field id = new Field("Id", app.Id.ToString(), Field.Store.YES, Field.Index.NOT_ANALYZED); Field name = new Field("Name", app.Brief.Name, Field.Store.NO, Field.Index.ANALYZED); Field description = new Field("Description", app.Description ?? String.Empty, Field.Store.NO, Field.Index.ANALYZED); Field developerName = new Field("DeveloperName", app.Brief.Developer.Name ?? String.Empty, Field.Store.NO, Field.Index.ANALYZED); Field category = new Field("Category", String.Join(" ", app.Categories.Select(c => c.Id)), Field.Store.NO, Field.Index.ANALYZED); NumericField deviceType = new NumericField("DeviceType", Field.Store.NO, true); deviceType.SetIntValue((int)app.Brief.DeviceType); NumericField languagePriority = new NumericField("LanguagePriority", Field.Store.NO, true); languagePriority.SetIntValue(app.Brief.LanguagePriority); doc.Add(id); doc.Add(name); doc.Add(description); doc.Add(developerName); doc.Add(category); doc.Add(deviceType); doc.Add(languagePriority); // 排序字段 Field nameForSort = new Field("NameForSort", app.Brief.Name, Field.Store.NO, Field.Index.NOT_ANALYZED); NumericField lastValidUpdateTimee = new NumericField("LastValidUpdateTime", Field.Store.NO, true); lastValidUpdateTimee.SetLongValue(app.Brief.LastValidUpdate.Time.Ticks); NumericField price = new NumericField("Price", Field.Store.NO, true); price.SetFloatValue(app.Brief.Price); NumericField ratingCount = new NumericField("Rating", Field.Store.NO, true); ratingCount.SetIntValue(app.Brief.AverageUserRatingForCurrentVersion.HasValue ? (int)app.Brief.AverageUserRatingForCurrentVersion : 0); doc.Add(nameForSort); doc.Add(lastValidUpdateTimee); doc.Add(price); doc.Add(ratingCount); return doc; }
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; }
protected void AddNumericField(string name, long value) { NumericField numericField = new NumericField(name, 4, Field.Store.YES, true); numericField.SetLongValue(value); _document.Add(numericField); }
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; }
public Document ToDocument() { var doc = new Document(); doc.Add(new Field("Id", Id.ToString(), Field.Store.YES, Field.Index.NOT_ANALYZED)); doc.Add(new Field("Text", Text, Field.Store.YES, Field.Index.ANALYZED)); var timestamp = new NumericField("Timestamp", Field.Store.YES, true); timestamp.SetLongValue(Timestamp.Ticks); doc.Add(timestamp); doc.Add(new Field("SourceHost", SourceHost, Field.Store.YES, Field.Index.NOT_ANALYZED)); doc.Add(new Field("SourceFile", SourceFile, Field.Store.YES, Field.Index.NOT_ANALYZED)); return doc; }
/// <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); } }
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); } }
internal static Document CreateDocument(IndexDocumentInfo info, IndexDocumentData docData) { var doc = new Document(); foreach (var fieldInfo in info.fields) doc.Add(CreateField(fieldInfo)); var path = docData.Path.ToLower(); //doc.Add(new Field(LucObject.FieldName.Name, RepositoryPath.GetFileName(path), Field.Store.YES, Field.Index.ANALYZED)); //doc.Add(new Field(LucObject.FieldName.Path, path, Field.Store.YES, Field.Index.NOT_ANALYZED_NO_NORMS)); doc.Add(CreateStringField(LucObject.FieldName.Name, RepositoryPath.GetFileName(path), NameFieldIndexingInfo)); doc.Add(CreateStringField(LucObject.FieldName.Path, path, NameFieldIndexingInfo)); //LucObject.FieldName.Depth var nf = new NumericField(LucObject.FieldName.Depth, Field.Store.YES, true); nf.SetIntValue(DepthIndexHandler.GetDepth(docData.Path)); doc.Add(nf); //LucObject.FieldName.InTree //var fields = InTreeIndexHandlerInstance.GetIndexFields(LucObject.FieldName.InTree, docData.Path); var fields = CreateInTreeFields(LucObject.FieldName.InTree, docData.Path); foreach (var field in fields) doc.Add(field); //LucObject.FieldName.InFolder doc.Add(CreateInFolderField(LucObject.FieldName.InFolder, path)); //LucObject.FieldName.ParentId nf = new NumericField(LucObject.FieldName.ParentId, Field.Store.NO, true); nf.SetIntValue(docData.ParentId); doc.Add(nf); // flags doc.Add(new Field(LucObject.FieldName.IsLastPublic, docData.IsLastPublic ? BooleanIndexHandler.YES : BooleanIndexHandler.NO, Field.Store.YES, Field.Index.NOT_ANALYZED, Field.TermVector.NO)); doc.Add(new Field(LucObject.FieldName.IsLastDraft, docData.IsLastDraft ? BooleanIndexHandler.YES : BooleanIndexHandler.NO, Field.Store.YES, Field.Index.NOT_ANALYZED, Field.TermVector.NO)); // timestamps nf = new NumericField(LucObject.FieldName.NodeTimestamp, Field.Store.YES, true); nf.SetLongValue(docData.NodeTimestamp); doc.Add(nf); nf = new NumericField(LucObject.FieldName.VersionTimestamp, Field.Store.YES, true); nf.SetLongValue(docData.VersionTimestamp); doc.Add(nf); // custom fields if (info.HasCustomField) { var customFields = CustomIndexFieldManager.GetFields(info, docData); if (customFields != null) foreach (var field in customFields) doc.Add(field); } return doc; }
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; }