Elasticsearch NEST и основной поисковый запрос - PullRequest
1 голос
/ 20 марта 2019

Я новичок в Elasticsearch и использую NEST. Когда я запускаю запрос в браузере (host / logstash-2019.03.17 / _search? Pretty), я получаю следующий результат:

{
 "took" : 138,
 "timed_out" : false,
   "shards" : {
     "total" : 1,
     "successful" : 1,
     "skipped" : 0,
     "failed" : 0
  },
  "hits" : {
    "total" : {
     "value" : 10,
     "relation" : "eq"
 },
  "max_score" : 1.0,
  "hits" : [
  {
    "_index" : "logstash-2019.03.17",
    "_type" : "logevent",
    "_id" : "aa7djGkB1zvCMljS8jPd",
    "_score" : 1.0,
    "_source" : {
      "@timestamp" : "2019-03-17T18:15:43.9506399Z",
      "level" : "Info",
      "message" : "Attempting to get results from ElasticSearch",
      "logger" : "App.Api.Controllers.MyController"
    }
  }, OTHER HITS IN THE SAME FORMAT 

Однако, когда я пытаюсь запросить тот же индекс, используя ElasticClient, я получаю следующее исключение:

Elasticsearch.Net.UnexpectedElasticsearchClientException: „Не удается десериализовать текущий объект JSON (например, {"name": "value"}) в тип 'System.Int64', поскольку тип требует значения примитива JSON (например, string, number, boolean, null) для правильной десериализации. Чтобы исправить это ошибка, либо измените JSON на значение примитива JSON (например, строку, number, boolean, null) или измените десериализованный тип так, чтобы он нормальный тип .NET (например, не примитивный тип, такой как целое число, не тип коллекции, такой как массив или список), который может быть десериализован из объекта JSON. JsonObjectAttribute также можно добавить к типу заставить его десериализовать из объекта JSON. Дорожка 'hit.total.value', строка 1, позиция 115. ”

Я думал, что NEST способен правильно автодесериализовать JSON при условии, что ему предоставляется класс, свойства которого соответствуют полям объекта "_source". По крайней мере, это то, что вы можете извлечь из этого учебника.

Вот мой класс POCO, следующий за запросом, который выдает исключение:

public class Logevent
    {
        public string Id { get; set; }
        public DateTime Timestamp { get; set; }
        public string Level { get; set; }
        public string Message { get; set; }
        public string Logger { get; set; }
    }


var client = new ElasticClient();

var searchResponse = client.Search<Logevent>(s => s.Index("logstash-2019.03.17").Query(q => q.Match(m => m.Field(f => f.Level).Query("message"))));

Может кто-нибудь объяснить, что я делаю не так?

1 Ответ

4 голосов
/ 20 марта 2019

Похоже, вы используете более новую версию Elasticsearch (может быть, один из пререлизов 7.0.0?), Где поле total больше не является просто значением Int64

"total" : {
     "value" : 10,
     "relation" : "eq"
}

NEST 6.x не справляется с этим, однако NEST 7.x, когда он будет выпущен.На данный момент я бы рекомендовал использовать последнюю версию Elasticsearch 6.x, в настоящее время 6.6.2.

Основные версии NEST связаны с основными версиями Elasticsearch, поэтому

  • NEST 5.x -> Elasticsearch 5.x
  • NEST 6.x -> Elasticsearch 6.x
  • и т. д.

Но я бы порекомендовал постоянно обновлять NESTнесовершеннолетние в мажоре;мы поддерживаем обратную бинарную совместимость в мажоре, чтобы помочь с этим.

...