#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"));
(например)