0

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 を使用) が含まれています。

4

1 に答える 1