Index a dictionary property in azure search

南楼画角 提交于 2021-02-17 05:46:48

问题


I have a DTO with a property of type Dictionary<string, string>. It's not annotated. When I upload my DTO and call indexClient.Documents.Index(batch), I get this error back from the service:

The request is invalid. Details: parameters : A node of type 'StartObject' was read from the JSON reader when trying to read the contents of the property 'Data'; however, a 'StartArray' node was expected.

The only way I've found to avoid it is by setting it to null. This is how I created my index:

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

How can I index my dictionary?


回答1:


Azure Cognitive Search doesn't support fields that behave like loosely-typed property bags like dictionaries. All fields in the index must have a well-defined EDM type.

If you don't know the set of possible fields at design-time, you have a couple options, but they come with big caveats:

  1. In your application code, add new fields to the index definition as you discover them while indexing documents. Updating the index will add latency to your overall write path, so depending on how frequently new fields are added, this may or may not be practical.
  2. Model your "dynamic" fields as a set of name/value collection fields, one for each desired data type. For example, if a new string field "color" is discovered with value "blue", the document you upload might look like this:
{
    "id": "123",
    "someOtherField": 3.5,
    "dynamicStringFields": [
        {
            "name": "color",
            "value": "blue"
        }
    ]
}

Approach #1 risks bumping into the limit on the maximum number of fields per index.

Approach #2 risks bumping into the limit on the maximum number of elements across all complex collections per document. It also complicates the query model, especially for cases where you might want correlated semantics in queries.



来源:https://stackoverflow.com/questions/58719062/index-a-dictionary-property-in-azure-search

易学教程内所有资源均来自网络或用户发布的内容,如有违反法律规定的内容欢迎反馈
该文章没有解决你所遇到的问题?点击提问,说说你的问题,让更多的人一起探讨吧!