ES7 + NEST, необходимо вернуть DocValueField с форматом: epoch_millis - PullRequest
0 голосов
/ 24 января 2020

У меня есть это отображение:

  "mapping": {
    "message": {
      "dynamic_templates": [
        {
          "internal_fields": {
            "match": "gl2_*",
            "mapping": {
              "type": "keyword"
            }
          }
        },
        {
          "store_generic": {
            "match_mapping_type": "string",
            "mapping": {
              "type": "keyword"
            }
          }
        }
      ],
      "properties": {
        ...
        <abbreviated>
        ..
        "sqldocumentid": {
          "type": "keyword"
        },
        "stacktrace": {
          "type": "keyword"
        },
        "streams": {
          "type": "keyword"
        },
        "timestamp": {
          "type": "date",
          "format": "yyyy-MM-dd HH:mm:ss.SSS"
        },
        "type": {
          "type": "keyword"
        }
      }
    }
  }
}

Я могу отправить этот вызов вручную, чтобы он возвратил поле "timestamp" в "epoch_millis", и оно работает:

{
  "version": true,
  "size": 500,
  "sort": [
    {
      "timestamp": {
        "order": "desc",
        "unmapped_type": "boolean"
      }
    }
  ],
  "_source": {
    "excludes": []
  },
  "aggs": {
    "2": {
      "date_histogram": {
        "field": "timestamp",
        "interval": "10m",
        "time_zone": "Europe/London",
        "min_doc_count": 1
      }
    }
  },
  "stored_fields": [
    "*"
  ],
  "script_fields": {},
  "docvalue_fields": [
    {
      "field": "timestamp",
      "format": "epoch_millis"
    }
  ],
  "query": {
... <abbreviated>

I Сейчас я пытаюсь изменить существующий запрос NEST, который выполняет / редактирует тот же поиск, но заставляет его возвращать время EPOCH вместо того, чтобы его мог прочитать человек.

ДО:

var scrollObserver = client.ScrollAll<Models.ERDetail>("2m", numberOfSlices, s => s
                    .MaxDegreeOfParallelism(numberOfSlices)
                    .Search(search => search
                        .Size(10000)
                        .Index("graylog_*")
                        .Sort(sort => sort
                                .Ascending(f => f.timestamp))
                        .Query(qry => qry
                            .Bool(b => b
                                .Filter(
                                    fq => fq
                                    .Exists(e => e
                                        .Field("sqldocumentid")
                                        .Field("humanmessage")
                                        .Field("importstatus")
                                        .Field("originalnumber")
                                        )
                                     )
                                .Must(m => m
                                    .QueryString(qs => qs
                                        .Fields("sqldocumentid")
                                        .Query(condition)))))
                    )
                )

AFTER:

var scrollObserver = client.ScrollAll<Models.ERDetail>("2m", numberOfSlices, s => s
                    .MaxDegreeOfParallelism(numberOfSlices)
                    .Search(search => search
                        .Size(10000)
                        .Index("graylog_*")
                        .Sort(sort => sort
                                .Ascending(f => f.timestamp))
                        .Query(qry => qry
                            .Bool(b => b
                                .Filter(
                                    fq => fq
                                    .Exists(e => e
                                        .Field("sqldocumentid")
                                        .Field("humanmessage")
                                        .Field("importstatus")
                                        .Field("originalnumber")
                                        )
                                     )
                                .Filter(fd => fd
                                    .DateRange(dr => dr
                                        .Field("timestamp")
                                        .Format("epoch_millis")))
                                .Must(m => m
                                    .QueryString(qs => qs
                                        .Fields("sqldocumentid")
                                        .Query(condition)))))
                         .DocValueFields(df => df
                            .Field("timestamp", boost: null, format: "epoch_millis")))

POCO:

[Date(Name = "timestamp", Format = "epoc_millis")]
        public string timestamp { get; set; } // have tried DateTime here as well
        public string originalnumber { get; set; }
        public string insertednumber { get; set; }
        public string importstatus { get; set; }
        public string humanmessage { get; set; }
        public string sqldocumentid { get; set; }

Но независимо от этих изменений, NEST возвращается с нормально выглядящей временной меткой или исключает недопустимый формат типа входящей даты, когда POCO использует DateTime вместо строки.

Буду признателен за любую помощь, чтобы NEST вернул то же самое, что и мой тест скручивания (отметка времени в эпоху).

Я бы хотел, чтобы ES выполнял "тяжелую работу" "и не обрабатывать читаемую человеком метку времени до UT C в C# land.

Edit:

Пример метки времени, возвращаемой эластичным поиском с использованием NEST:

2020-01-24 11:12:09.22

Использование этой метки времени с помощью curl и epoch_millis преобразуется в мое желание.

Я использую NEST 7.5.1. NET Стандарт

...