Индексируйте свойство словаря в поиске Azure. - PullRequest
0 голосов
/ 05 ноября 2019

У меня есть DTO со свойством типа Dictionary<string, string>. Это не аннотировано. Когда я загружаю свой DTO и звоню indexClient.Documents.Index(batch), я получаю эту ошибку от службы:

Запрос недействителен. Подробности: параметры: узел типа StartObject был прочитан из программы чтения JSON при попытке прочитать содержимое свойства «Данные»;однако, ожидался узел 'StartArray'.

Единственный способ избежать этого - найти для него значение null. Вот как я создал свой индекс:

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

Как мне проиндексировать мой словарь?

1 Ответ

0 голосов
/ 10 ноября 2019

Azure Cognitive Search не поддерживает поля, которые ведут себя как свободно набранные пакеты свойств, такие как словари. Все поля в индексе должны иметь четко определенный тип EDM .

Если вы не знаете набор возможных полей во время разработки, у вас есть пара вариантов, но ониПриходите с большими предостережениями:

  1. В своем коде приложения добавляйте новые поля в определение индекса по мере их обнаружения при индексации документов. Обновление индекса добавит задержку к вашему общему пути записи, поэтому в зависимости от того, как часто добавляются новые поля, это может или не может быть практичным.
  2. Моделируйте ваши "динамические" поля как набор имен / значений. поля, по одному для каждого желаемого типа данных. Например, если обнаружено новое строковое поле «цвет» со значением «синий», загружаемый вами документ может выглядеть следующим образом:
{
    "id": "123",
    "someOtherField": 3.5,
    "dynamicStringFields": [
        {
            "name": "color",
            "value": "blue"
        }
    ]
}

Подход № 1 может столкнуться с ограничение на максимальное количество полей в индексе .

Подход № 2 рискует натолкнуться на ограничение на максимальное количество элементов во всех сложных коллекциях на документ . Это также усложняет модель запроса, особенно для случаев, когда вам может понадобиться коррелированная семантика в запросах.

...