【问题标题】:ElasticSearch NEST GET response not deserializedElasticSearch NEST GET 响应未反序列化
【发布时间】:2018-01-24 18:03:36
【问题描述】:

我们连接到来自第三方的 ElasticSearch 以使用 NEST nuget 包获取一些数据。但是,如果我们使用 GET 调用,则响应不会在强类型 POCO 中反序列化。 HTTP 调用成功,body 中有一个带有数据的 json 对象。

var result = _elasticSearchClient.Get<Contractor>(188153, request => request
.Index("{index_name}")
.Type("{type_name}"));

--POCO. Naming of the property as in the json message
public class Contractor
{
public int contractor_id { get; set; }
public string type { get; set; }
public string type_description { get; set; }
public string contractor_code { get; set; }
public string name { get; set; }
...
}

使用 HttpClient 和 JsonCovert 调用来反序列化对象的工作原理

var response = Task.Run(() => _httpClient.GetAsync(url)).Result;
var responseMessage = Task.Run(() => response.Content.ReadAsStringAsync()).Result;
var contractor = JsonConvert.DeserializeObject<Contractor>(responseMessage);

ElasticSearchClient 的配置

var url = new Uri($"{BaseUrl}");

var connectionSettings = new ConnectionSettings(url);
connectionSettings.ClientCertificate(GetCertificateFromStore());
connectionSettings.BasicAuthentication(Username, Password);
connectionSettings.ThrowExceptions();
connectionSettings.PrettyJson();
connectionSettings.DisableDirectStreaming();
connectionSettings.DefaultFieldNameInferrer(p => p);

var elasticSearchClient = new ElasticClient(connectionSettings);

调试信息: 有效的 NEST 响应来自对 GET 的成功低级调用:/{index_name}/{type_name}/188153?pretty=true

此 API 调用的审核跟踪: - [1] 健康响应:节点:https://{baseUrl}/ 接受:00:00:01.0835021 请求:请求流未捕获或已被序列化程序读取完成。在 ConnectionSettings 上设置 DisableDirectStreaming() 以强制在响应中设置它。

回复:

{
  "_index" : "{index_name}",
  "_type" : "{type_name}",
  "_id" : "188153",
  "_version" : 1,
  "found" : true,
  "_source" : {
    "contractor" : {
      "contractor_id" : 188153,
      "type" : "OVE",
      "type_description" : "Overig",
      "contractor_code" : "RES0000826",
      "name" : "OrganizationName", 
   }
}

NEST NuGet 包 5.6.0

Elasticsearch 6.0.0 版

我错过了什么?

【问题讨论】:

  • 您使用的是什么版本的 NEST?您运行的是哪个版本的 Elasticsearch? result 上的 .DebugInformation 说什么?
  • 我用附加信息编辑了问题。

标签: c# elasticsearch get deserialization nest


【解决方案1】:

它没有被 NEST 反序列化,因为 Elasticsearch 中的 _source 文档是一个具有一个属性的对象,"contractor",其值是一个包含属性的对象。

为了正确反序列化,Elasticsearch 中的 _source 文档需要是

  "_source" : {
      "contractor_id" : 188153,
      "type" : "OVE",
      "type_description" : "Overig",
      "contractor_code" : "RES0000826",
      "name" : "OrganizationName"
   }

或者,POCO应该类似于

public class ContractorWrapper //choose any type name you like :)
{
    public Contractor contractor { get;set; }
}

匹配 JSON 结构。

【讨论】:

  • 这是将对象放在 Source 中的最佳做法还是应该作为 Contractor 对象在 _source 中的根?
  • @Devliegendebeer _source 包含 JSON 文档,因为它在被索引时被发送到 Elasticsearch。我认为在您的情况下,_source JSON 应该是我在第一个代码示例中显示的方式。如果可以的话,我倾向于将索引代码更改为这样的序列化。
猜你喜欢
  • 1970-01-01
  • 2022-08-04
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2020-10-19
  • 2019-10-28
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多