Как сохранить список объектов c # в ElasticSearch с помощью NEST 2.x

#c# #elasticsearch #nest

#c# #elasticsearch #гнездо

Вопрос:

Я разрабатываю кроссплатформенное приложение с помощью xamarin.forms и пытаюсь найти способ сохранить список объектов непосредственно в ElasticSearch, чтобы позже я мог искать результаты на основе объектов списков. Мой сценарий выглядит следующим образом:

 public class Box {

    [String(Index = FieldIndexOption.NotAnalyzed)]
    public string id { get; set; }

    public List<Category> categories { get; set; }
}


public class Category {

    [String(Index = FieldIndexOption.NotAnalyzed)]
    public string id { get; set; }

    public string name { get; set; }
}
  

Моя цель — иметь возможность искать все поля, которые имеют определенную категорию.

Я попытался отобразить все правильно, как указано в документации, но если я сделаю это так, когда я сохраняю поле, оно сохраняет только первую категорию.

Есть ли на самом деле способ сделать это или это просто невозможно с помощью NEST?

Любые советы приветствуются!

Спасибо

Ответ №1:

Он должен просто отлично работать с AutoMap, используя код в документации:

Если индекс не существует:

var descriptor = new CreateIndexDescriptor("indexyouwant")
.Mappings(ms => ms
.Map<Box>(m => m.AutoMap())
);

а затем вызвать что-то вроде:

await client.CreateIndexAsync(descriptor).ConfigureAwait(false);

или, если не используется async:

client.CreateIndex(descriptor);

Если индекс уже существует

Затем забудьте о создании части CreateIndexDescriptor выше и просто вызовите:

await client.MapAsync<Box>(m => m.Index("existingindexname").AutoMap()).ConfigureAwait(false);

или, если не используется async:

client.Map<Box>(m => m.Index("existingindexname").AutoMap());

После того, как вы успешно создали сопоставление для типа, вы можете индексировать документы.

Возможно ли, что сначала у вас была только одна категория в поле и она была сопоставлена с индексом (до того, как вы превратили ее в список)? Потому что тогда вам придется вручную редактировать отображение, я думаю, например, в Sense.

Я не знаю, есть ли у вас уже важные данные в вашем индексе, но вы также можете удалить весь индекс (сопоставление тоже будет удалено) и повторить попытку. Но тогда вы потеряете все документы, которые вы уже проиндексировали по всему индексу.

Комментарии:

1. Я удалил индекс и сделал все это, как указано в документации, но когда я попытался сохранить список, он сохранил только первый объект списка

2. Не могли бы вы показать, как выглядит ваше отображение на данный момент, и код, в котором вы индексируете поле?

3. После создания индекса с сопоставлением вы должны иметь возможность индексировать документы с помощью следующего кода: client.Index<Box>(refToObj, i => i.Index("index").Type("type").Id("id")); (например)