【问题标题】:Azure Search v11: Indexing nullable Collection of Complex TypeAzure 搜索 v11:索引复杂类型的可为空集合
【发布时间】:2021-04-25 16:00:10
【问题描述】:

我正在将 Azure 认知搜索 服务的 SDK 从 v10 更新到 v11。我已按照指南中的所有步骤进行升级,但是我注意到索引(合并或上传)操作的一个奇怪行为:UploadDocumentAsync(但也有用于索引数据的其他方法) 操作在 Collection (Edm.ComplexType) 类型的属性为 null 时失败,并出现以下错误:

在尝试读取属性的内容时,从 JSON 读取器读取了“PrimitiveValue”类型的节点。但是,“StartArray”节点应该是 json。

IndexDocumentsResult response = await searchClient.UploadDocumentsAsync<T>(documents).ConfigureAwait (false);

v10 没有出现这个问题。我发现的一种解决方法是将集合设置为空数组而不是空值,但我想找到更好的解决方案。

编辑: 我从 Microsoft.Azure.Search v10.1.0 升级到 Azure.Search.Documents v11.1.1 以下是用于索引数据的通用 T 类的示例:

public class IndexEntity
{
    [JsonProperty("@search.score")]
    public double SearchScore { get; set; }

    [JsonProperty("Key")]
    public Guid Id { get; set; }

    [JsonProperty("Code")]
    public string Code { get; set; }

    [JsonProperty("ComplexObj")]
    public ComplexType[] CollectionOfComplexType{ get; set; }

}

遵循ModelObjectToIndex的定义

public class ComplexType
{
    [JsonProperty("Id")]
    public string Id { get; set; }

    [JsonProperty("Value")]
    public string Value { get; set; }
}

基本上当 CollectionOfComplexType 属性为空时,我会收到上述错误。如果我将其设置为空数组,则不会发生错误,但如上所述我不喜欢这种解决方案,而且在旧版本中它是允许的操作(索引已成功完成)

【问题讨论】:

  • 请格式化您的问题,以便于阅读,
  • @aybe 现在好点了吗?
  • 您能否编辑您的问题以包括 T 的定义和文档实例的详细信息?这将帮助我们解决问题。
  • 绝对更好
  • 您使用的是什么版本的 Azure.Search.Documents?我是它的开发人员之一,我们确实在旧版本中遇到了一些问题,这些问题并不期望在响应中出现文字 null,因此反序列化可能会引发这种情况。您是否有可以清理和共享的文档示例?

标签: c# json azure azure-cognitive-search azure-sdk-.net


【解决方案1】:

我们的 Azure.Search.Documents 行为似乎在这方面发生了变化。我已经打开https://github.com/Azure/azure-sdk-for-net/issues/18169 来跟踪分辨率。

您可以通过传入 JsonSerializerSettings 来解决此问题,而无需将集合初始化为空数组,这与我们在旧版 Microsoft.Azure.Search 库中所做的类似,因为它似乎来自使用 JsonPropertyAttribute 你'无论如何都在使用Newtonsoft.Json(又名Json.NET):

  1. 如果尚未添加对 Microsoft.Azure.Core.NewtonsoftJson 的包引用,请添加。它最近 GA 发布了,因此如果您是,则无需使用预览,我认为这是因为 System.Text.Json - 我们的默认序列化程序 - 不会尊重您的属性重命名。

  2. 在创建SearchClient 之前传入JsonSerializerSettings,如下所示:

    var settings = new JsonSerializerSettings
    {
        // Customize anything else you want here; otherwise, defaults are used.
        NullValueHandling = NullValueHandling.Ignore,
    };
    
    var options = new SearchClientOptions
    {
        Serializer = new NewtonsoftJsonObjectSerializer(settings),
    };
    
    var searchClient = new SearchClient(options);
    

如果可以的话,我们将讨论如何在默认情况下解决此问题。与旧库相比的一大变化是能够自定义使用的序列化程序。默认情况下,我们使用System.Text.Json,但我们支持其他序列化程序,包括Newtonsoft.Json。如果有人要传入他们自己的设置 - 或者甚至想要默认设置 - 更改可能是灾难性的。所以我很好奇:如果我们至少记录了这种行为变化(可能在SearchClient 类评论和/或UploadDocuments 和相关方法上)以及如何保留以前的行为,那会有所帮助还是令人满意?

【讨论】:

  • 非常感谢您的帮助。我同意你的看法:添加此行为更改,或者可能是特别关注如何管理 null 文字值的部分,可能会非常有帮助。
猜你喜欢
  • 2023-03-11
  • 1970-01-01
  • 2021-06-07
  • 1970-01-01
  • 2020-03-02
  • 2020-07-20
  • 2019-12-18
  • 2011-05-02
  • 2021-03-13
相关资源
最近更新 更多