2017-08-29 219 views
0

嗨有一个基本的一对多结构..设置父为子对象ElasticSearch使用ElasticSearch NEST .NET库

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; } 
} 

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

探索从最后2天的网络,但无法找到设置人士为技能父母的方式..

我假设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我得到这个错误的时间:

如果没有父领域已配置

在探索我不能指定父发现可能的文章说,我需要设置父类型的映射中的孩子..但如何..什么是程序自定义映射索引以及如何和在哪里我应该做的..没有得到任何提示..请指导

回答

0

问题是我没有得到勒到亲子文件正确映射。我们可以通过预定义的映射创建索引映射他们或者我们可以更新映射

创建索引

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 
    } 
} 

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