elasticsearch - Nest.ConnectionSettings.SetJsonSerializerSettingsModifier还能工作吗?

标签 elasticsearch nest elasticsearch-net

这是我的问题。由于项目需求,我们必须将日期以相同的格式保存在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,我发现最终有一个契约(Contract)解析器似乎覆盖了所有这些设置:
          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 是使用默认设置实例化的,而不是我通过 SetJsSonSerializer传递的默认设置,因此我的json设置将消失。

有没有人遇到这个问题?还是我只是想念什么?提前致谢!

最佳答案

这是我根据需要处理自定义日期格式的方式:

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"
    }
}

希望对您有帮助。

关于elasticsearch - Nest.ConnectionSettings.SetJsonSerializerSettingsModifier还能工作吗?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/30120366/

相关文章:

python - 等待使用 elasticsearch DSL 完成 UpdateByQuery

curl - 仅从 elasticsearch 查询返回 _source 数据

elasticsearch - 如何在Elasticsearch和Nest中添加动态构面

elasticsearch - Elasticsearch字词查询不匹配的URL

python - 在python查询中将index作为参数传递给elasticsearch

elasticsearch - 使用Kibana覆盖/更新现有的Elasticsearch索引映射(geo_point)

elasticsearch - 升级Beats和索引模板是否会影响 Elasticsearch 中的旧数据?

elasticsearch - 使用 NEST 5.x 创建 Elasticsearch 索引

.net - 随着索引和文档数量不变,elasticsearch 批量索引会随着时间变慢

c# - 如何使用 ElasticSearch 只返回属性的子集