我是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"))));
有人可以解释我在做什么错吗?
答案 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;我们在专业领域内保持向后的二进制兼容性以帮助实现这一点。