【问题标题】:ElasticSearch set parent for child object using ElasticSearch NEST .NET libraryElasticSearch 使用 ElasticSearch NEST .NET 库为子对象设置父对象
【发布时间】:2017-08-29 10:18:40
【问题描述】:

嗨有一个基本的一对多结构..

public class Person {
      public int PersonId { get; set; }
      public string Name { get; set; }
      public List<Skill> Skills { get; set; }
}

public class Skill{
      public int PersonId { get; set; }
      public int SkillId { get; set; }
      public string Name { get; set; }
      public string Description { get; set; }
}

使用 .NET Framework 4.5 .. 安装 ElasticSearch NEST 5.x ..

从过去 2 天开始探索网络,但无法找到将 Person 设置为 Skill .. 的父级的方法 ..

我假设 NEST 会自动映射父子关系,所以我尝试关注

private ElasticLowLevelClient client = new ElasticLowLevelClient();    

public void CreatePerson(Person person)
        {
var parentResponse = client.Index(person, i => i.Index("myindex").Type("person").Id(person.PersonId));
    foreach (var skill in person.Skills)
    {
       var skillResponse = client.Index(skill, i => i.Index("myindex").Type("personskills").Parent(person.PersonId.ToString()).Id(skill.SkillId)); //here I am getting error
    }
}

创建人员的文档没有任何问题,但在创建personskill doc时我收到此错误:

如果没有配置父字段,则无法指定父字段

在探索时,我发现可能有文章说我需要在映射中将父类型设置为子类型.. 但是如何.. 自定义映射索引的过程是什么以及我应该如何以及在何处执行此操作.. 没有得到任何提示..请指导

【问题讨论】:

    标签: c# asp.net model-view-controller nest


    【解决方案1】:

    问题是我无法正确映射父子文档。我们可以通过使用预定义映射创建索引来映射它们,或者我们可以更新映射

    创建索引

    private ElasticLowLevelClient client = new ElasticLowLevelClient();    
    private CreateIndexDescriptor descriptor = new CreateIndexDescriptor("myindex")
                  .Mappings(ms => ms
                  .Map<Person>("person", m => m.AutoMap())
                  .Map<Skill>("personskills", m => m.AutoMap().Parent("person"))
              );        
    
    public void CreatePerson(Person person)
    {
        client.CreateIndex(descriptor); //I am creating it here but one can create it in the class where we will create ElasticClient
        var parentResponse = client.Index(person, i => i.Index("myindex").Type("person").Id(person.PersonId));
        foreach (var skill in person.Skills)
        {
           var skillResponse = client.Index(skill, i => i.Index("myindex").Type("personskills").Parent(person.PersonId.ToString()).Id(skill.SkillId)); //here I am getting error
        }
    }
    

    更新映射

    public void CreatePerson(Person person)
            {
     client.Map<Skill>(m => m
                                     .Parent("person").Index("myindex")); //this will put the default mapping of default index
    var parentResponse = client.Index(person, i => i.Index("myindex").Type("person").Id(person.PersonId));
        foreach (var skill in person.Skills)
        {
           var skillResponse = client.Index(skill, i => i.Index("myindex").Type("skill").Parent(person.PersonId.ToString()).Id(skill.SkillId)); //here I am getting error
        }
    }
    

    这里我已将子文档类型更改为默认值.. 但可以在映射中设置它。希望这可以帮助其他人。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多