Elasticsearch NEST和基本搜索查询

时间:2019-03-20 11:32:59

标签: c# elasticsearch nest

我是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”})反序列化为type   'System.Int64',因为该类型需要JSON基本值(例如   字符串,数字,布尔值,null)正确反序列化。要解决这个问题   错误,或者将JSON更改为JSON基本值(例如字符串,   数字,布尔值,null)或更改反序列化类型,使其为   普通的.NET类型(例如,不是整数之类的原始类型,不是   可以反序列化的集合类型(如数组或列表)   从JSON对象。也可以将JsonObjectAttribute添加到类型中   强制其从JSON对象反序列化。路径   'hits.total.value',第1行,位置115。”

我认为NEST能够正确提供JSON自动反序列化的条件,前提是该类提供了其属性与“ _source”对象字段相对应的类。至少您可以从this教程中得出结论。

这是我的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 个答案:

答案 0 :(得分:4)

您似乎使用的是Elasticsearch的较新版本(可能是7.0.0的预发行版之一),其中the total field is no longer just an Int64 value

"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;我们在专业领域内保持向后的二进制兼容性以帮助实现这一点。