2015-01-15 4 views
0

Когда я пытаюсь проиндексировать документ моего определенного типа, имея список, который должен быть отображен как вложенный объект («type»: «inested»), он получает сопоставление как обычный тип объекта.Проблемы с вложенными объектами с использованием Nest

Взгляните на код:

У меня есть простой класс, как этот:

[ElasticType()] 
public class MyJob 
{ 
    [ValueFieldAttribute] 
    public int jobCode { get; set; } 

    [ValueFieldAttribute(Type = FieldType.nested)] 
    public IList<JobProfessionalFieldInfo> JobProfessionalFields { get; set; } 
} 

Код класса JobProfessionalFieldInfo является:

[ElasticType()] 
public class JobProfessionalFieldInfo 
{ 
    [ValueFieldAttribute] 
    public int JobId { get; set; } 

    [ValueFieldAttribute] 
    public int CategoryId { get; set; } 
} 

Кодекса для класса ValueFieldAttribute:

public class ValueFieldAttribute : ElasticPropertyAttribute 
{ 
    public ValueFieldAttribute() 
     : base() 
    { 
     this.Store = false; 
     this.Index = FieldIndexOption.not_analyzed; 
    } 
} 

Моя программа:

static void Main(string[] args) 
    { 
     ConnectionSettings node = new ConnectionSettings(new Uri("http://localhost:9200")); 
     node.SetDefaultIndex("jobs"); 
     ElasticClient client = new ElasticClient(node); 

     List<JobProfessionalFieldInfo> list = new List<JobProfessionalFieldInfo>(); 
     list.Add(new JobProfessionalFieldInfo { CategoryId = 1, JobId = 1 }); 
     list.Add(new JobProfessionalFieldInfo { CategoryId = 2, JobId = 2 }); 
     var res = client.Index<MyJob>(new MyJob 
     { 
      jobCode = 1, 
      JobProfessionalFields = list 
     },"jobs", "MyJob",1); 
    } 

Теперь, когда я запускаю его, он индексирует объект успешно ... НО (!!), когда я получаю отображение индекса с GET заданий/MyJob/_mapping, я вижу что jobProfessionalFields не имеет «типа»: «вложен» в его отображение.

Это приводит в запросе, как следующий один, возвращая индексированный документ, пока он не должен получить его обратно (это то, что вложенные типа для правой ..?):

GET jobs/_search 
{ 
    "query": 
    { 
     "bool": 
     { 
      "must": 
      [ 
       {"match": {"jobId":1}}, 
       {"match": {"categoryId":2}}    
      ] 
     } 
    }  
} 

Это не end: Я бы посмотрел на here, , там ответчик ответил, что, когда мы используем аннотации, нам нужно вручную вызвать методы createIndex и Map, но проблема в том, что у меня нет универсального метода Map. .! Взгляните на here: (просто чтобы вы попали в ссылку - вот его начало ..)

namespace Nest 
{ 
    public partial class ElasticClient... 

И я не знаю, как использовать, не универсальный метод Map поставить отображение мой класс MyJob.

Как я могу заставить этот материал отображать jobProfessionalFields как чужие вложенные типы?

Спасибо за любую помощь вам, ребята!

ответ

0

ОК, получил это LOL!

MapFromAttributes <> - это правильный общий метод для размещения отображения (по крайней мере, в текущей версии Nest, которую я использую - 0.12.0). Но он требует ручного вызова для создания indexg, o.w он дает исключение IndexMissing (как сказал парень в упомянутой выше ссылке).

 client.CreateIndex("jobs", new IndexSettings { }); 
     var res = client.MapFromAttributes<MyJob>("jobs","MyJob"); 

Но что действительно интересно, почему не достаточно просто определить

[ElasticProperty (тип = FieldType.nested)],

для того, чтобы получить вложенное отображение хотя ..

Я был бы рад получить ответ на этот вопрос.

Смежные вопросы