Nest のナゲットを 0.9.20.6 から最新バージョン 0.11.1.0 に更新したところ、インデックスを作成する null オブジェクト参照が取得されました。私のコードは変更されていませんが、正しくなかった可能性があります。また、Json.Net を v 5.0.6.2 に更新しました。コール スタックは、JsonSerializer が失敗した場所であることを示しました。
したがって、呼び出しスタックは次のようになります。
at Nest.Resolvers.Converters.IndexSettingsConverter.<>c__DisplayClass2.b__0(RootObjectMapping m) in c:\Work\NEST\src\Nest\Resolvers\Converters\IndexSettingsConverter.cs:line 113
at System.Linq.Enumerable.ToDictionaryTSource,TKey,TElement
at System.Linq.Enumerable.ToDictionaryTSource,TKey
at Nest.Resolvers.Converters.IndexSettingsConverter.WriteJson(JsonWriter writer, Object value, JsonSerializer serializer) in c:\Work\NEST\src\Nest\Resolvers\Converters\IndexSettingsConverter.cs:line 112
at Newtonsoft.Json.Serialization.JsonSerializerInternalWriter.SerializeConvertable(JsonWriter writer, JsonConverter converter, Object value, JsonContract contract, JsonContainerContract collectionContract, JsonProperty containerProperty)
at Newtonsoft.Json.Serialization.JsonSerializerInternalWriter.SerializeValue(JsonWriter writer, Object value, JsonContract valueContract, JsonProperty member, JsonContainerContract containerContract, JsonProperty containerProperty)
at Newtonsoft.Json.Serialization.JsonSerializerInternalWriter.Serialize(JsonWriter jsonWriter, Object value, Type objectType)
at Newtonsoft.Json.JsonSerializer.SerializeInternal(JsonWriter jsonWriter, Object value, Type objectType)
at Newtonsoft.Json.JsonSerializer.Serialize(JsonWriter jsonWriter, Object value, Type objectType)
at Newtonsoft.Json.JsonConvert.SerializeObject(Object value, Type type, Formatting formatting, JsonSerializerSettings settings)
at Newtonsoft.Json.JsonConvert.SerializeObject(Object value, Formatting formatting, JsonSerializerSettings settings)
at Nest.ElasticClient.Serialize(Object object) in c:\Work\NEST\src\Nest\ElasticClient-Statics.cs:line 53
at Nest.ElasticClient.CreateIndex(String index, IndexSettings settings) in c:\Work\NEST\src\Nest\ElasticClient-CreateIndex.cs:line 18
...
フィールド マッピングに null の TypeNameMarker プロパティがあるため、これは失敗しています (上記のトレースの最初の行の Nest ソースを参照してください)。
フィールド マップを (アプリ内のいくつかの XML 定義から) 手動で作成します。
new StringMapping() { Name = fieldname, Index = idx, Store = field.Store };
なぜこれが変わったのか誰か知っていますか?
アップデート
マップを作成するために使用する完全なコードを次に示します。TypeNameMarker は 0.11 の新しいプロパティであるため、コメントアウトしたことがわかります。
IElasticType createFieldMap(Field field, bool notAnalyzed = false, string fieldname = null)
{
IElasticType att = null;
var idx = notAnalyzed ? FieldIndexOption.not_analyzed : (FieldIndexOption?)Enum.Parse(typeof(FieldIndexOption), field.Index);
var nsidx = notAnalyzed ? NonStringIndexOption.not_analyzed : (NonStringIndexOption?)Enum.Parse(typeof(NonStringIndexOption), field.Index);
var ft = (FieldType)Enum.Parse(typeof(FieldType), field.Type);
fieldname = fieldname ?? field.Name;
switch (ft)
{
case FieldType.string_type:
att = new StringMapping()
{
Name = fieldname,
Index = idx,
Store = field.Store,
//TypeNameMarker = "string"
};
if (field.CodeField)
{
(att as StringMapping).SearchAnalyzer = "keyword";
(att as StringMapping).IndexAnalyzer = "keyword";
}
else
{
(att as StringMapping).SearchAnalyzer = "simple";
(att as StringMapping).IndexAnalyzer = "simple";
}
break;
case FieldType.binary:
att = new BinaryMapping()
{
Name = fieldname,
//TypeNameMarker = "binary"
};
break;
case FieldType.boolean_type:
att = new BooleanMapping()
{
Name = fieldname,
Index = nsidx,
Store = field.Store,
//TypeNameMarker = "boolean"
};
break;
case FieldType.date_type:
att = new DateMapping()
{
Name = fieldname,
Index = nsidx,
Store = field.Store,
//TypeNameMarker = "date"
};
break;
case FieldType.double_type:
case FieldType.float_type:
case FieldType.integer_type:
case FieldType.long_type:
att = new NumberMapping()
{
Name = fieldname,
Index = nsidx,
Store = field.Store,
//TypeNameMarker = "number"
};
break;
}
return att;
}
各フィールドがルートマップに追加されます。
var props = new Dictionary<string, IElasticType>();
foreach (var field in doc.IndexMap.Fields)
{
if (!field.Sortable)
{
props.Add(field.Name, createFieldMap(field));
}
else
{
var mfm = new MultiFieldMapping();
mfm.Name = field.Name;
mfm.Fields.Add(field.Name, (IElasticCoreType)createFieldMap(field));
mfm.Fields.Add("sort", (IElasticCoreType)createFieldMap(field, true, "sort"));
props.Add(field.Name, mfm);
}
}
rootMap.Properties = props;
インデックスに含めるフィールドのリストを含む大きな xml ファイルがあります。実際のレコードは SQL から返され、この同じ XML ファイルには、実行するクエリといくつかの変更追跡情報 (rowversions を使用) が含まれています。