在天蓝色搜索中索引字典属性

时间:2019-11-05 20:34:15

标签: azure-cognitive-search azure-search-.net-sdk

我有一个DTO,其属性类型为Dictionary<string, string>。没有注释。当我上传DTO并致电indexClient.Documents.Index(batch)时,我从服务中获得了以下错误消息:

  

请求无效。详细信息:参数:尝试读取属性“ Data”的内容时,已从JSON阅读器读取了类型为“ StartObject”的节点。但是,应该有一个“ StartArray”节点。

我发现避免出现这种情况的唯一方法是将其设置为null。这就是我创建索引的方式:

var fields = FieldBuilder.BuildForType<DTO>();
client.Indexes.Create(new Index
{
    Name = indexName,
    Fields = fields
});

如何索引我的字典?

1 个答案:

答案 0 :(得分:0)

Azure认知搜索不支持行为类似于字典的宽松类型的属性包的字段。索引中的所有字段都必须具有定义明确的EDM type

如果您在设计时不知道可能的字段集,则有几种选择,但是它们带有一些警告:

  1. 在应用程序代码中,在为文档建立索引时发现它们时,将新字段添加到索引定义中。更新索引会增加整个写入路径的延迟,因此,根据添加新字段的频率,这可能是可行的,也可能是不现实的。
  2. 将“动态”字段建模为一组名称/值收集字段,每种所需的数据类型对应一个。例如,如果发现一个新字符串字段“ color”,其值为“ blue”,则您上载的文档可能如下所示:
{
    "id": "123",
    "someOtherField": 3.5,
    "dynamicStringFields": [
        {
            "name": "color",
            "value": "blue"
        }
    ]
}

方法1可能会碰到limit on the maximum number of fields per index

方法2可能会碰到limit on the maximum number of elements across all complex collections per document。它还使查询模型复杂化,尤其是在您可能希望在查询中使用correlated语义的情况下。