【问题标题】:Index a dictionary property in azure search在天蓝色搜索中索引字典属性
【发布时间】:2020-03-02 06:47:04
【问题描述】:

我有一个具有Dictionary<string, string> 类型属性的 DTO。它没有注释。当我上传我的 DTO 并调用 indexClient.Documents.Index(batch) 时,我从服务中收到此错误:

请求无效。详细信息:参数:尝试读取属性“数据”的内容时,从 JSON 读取器读取了“StartObject”类型的节点;但是,需要一个“StartArray”节点。

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

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

如何索引我的字典?

【问题讨论】:

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


    【解决方案1】:

    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 语义的情况。

    【讨论】:

    • 我需要支持来自最终用户的任意数据,所以我现在拥有的是 new Field("Data", DataType.Collection(DataType.String)) { IsFacetable = true },并且我将键值对序列化为一个字符串,如下所示:(KEY): (VALUE) 我没有相信将计入总字段的限制。虽然这并不理想,但我不希望每个文档有接近 3000 个,所以我相信这意味着我很安全。谢谢!
    • 3000 限制仅适用于复杂集合(对象数组),而不适用于字符串集合,因此只要支持您需要的查询场景,您的方法应该没问题。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2017-12-15
    • 1970-01-01
    • 1970-01-01
    • 2018-03-06
    • 2018-04-09
    • 1970-01-01
    • 2021-02-12
    相关资源
    最近更新 更多