1

これが私の質問です。プロジェクトのニーズにより、elasticsearch インデックス内の日付を同じ形式で保持する必要があります。私たちが試したのは次の方法です -

            var connectionPool = new SniffingConnectionPool(nodeList);
            var connectionSettings = new ConnectionSettings(connectionPool)
                 .SetJsonSerializerSettingsModifier(
                  m => m.DateFormatString = "yyyy-MM-ddTHH:mm:ss.fffffffK")
            // other configuration goes here

しかし、うまくいきませんでした。ESインデックスを検索すると、末尾のゼロが削除された日付が表示されました(2015-05-05T18:55:27Zのように、予想される2015-05-05T18:55:27.0000000Zが挿入されました)。次のオプションも役に立たなかった:

            var connectionPool = new SniffingConnectionPool(nodeList);
            var connectionSettings = new ConnectionSettings(connectionPool)
                 .SetJsonSerializerSettingsModifier(m =>
                    {
                        m.Converters.Add(new IsoDateTimeConverter { DateTimeFormat = "yyyy'-'MM'-'dd'T'HH':'mm':'ss.fffffffK"});
                    })
            // other configuration goes here

実行時に ElasticClient を掘り下げると、最終的にはこれらすべての設定をオーバーライドするように見えるコントラクト リゾルバーがあることがわかりました。

          public class ElasticContractResolver : DefaultContractResolver
          {
              protected override JsonContract CreateContract(Type objectType)
              {
                  JsonContract contract = base.CreateContract(objectType);
                  ...
                  if (objectType == typeof(DateTime) || objectType == typeof(DateTime?))
                      contract.Converter = new IsoDateTimeConverter();
                  ...
                  if (this.ConnectionSettings.ContractConverters.HasAny())
                  {
                      foreach (var c in this.ConnectionSettings.ContractConverters)
                      {
                          var converter = c(objectType);
                          if (converter == null)
                              continue;
                          contract.Converter = converter;
                          break;
                      }
                  }

                 return contract;
             }
          }

したがって、( Connection Settings.AddContractJsonConverters() を介して)コンバーターを明示的に指定せずに正しい場合、 IsoDateTimeConverterはSetJsonSerializerSettingsModifierを介して渡したものではなくデフォルト設定でインスタンス化されるため、json 設定はなくなります。

誰かがこの問題に遭遇しましたか? それとも私は何かが足りないのですか?前もって感謝します!

4

1 に答える 1

0

これは、私のニーズに合わせてカスタムの日付形式を処理した方法です。

public class Document
{
    [ElasticProperty(DateFormat = "yyyy-MM-dd", Type = FieldType.Date)]
    public string CreatedDate { get; set; }
}

client.Index(new Document {CreatedDate = DateTime.Now.ToString("yyyy-MM-dd")});

ES の私のドキュメント

{
    "_index": "indexname",
    "_type": "document",
    "_id": "AU04kd4jnBKFIw7rP3gX",
    "_score": 1,
    "_source": {
       "createdDate": "2015-05-09"
    }
}

それがあなたを助けることを願っています。

于 2015-05-09T12:11:03.407 に答える