2015-04-17 12 views
16

Tôi đang sử dụng thư viện NEST để tương tác với ElasticSearch và tôi đang cố gắng tìm cách xây dựng các loại chỉ mục/đối tượng lồng nhau dựa trên dữ liệu không phải loại. Loại có cấu trúc cơ bản sau.Làm cách nào để ánh xạ một loại .NET đơn lẻ đến nhiều loại đối tượng lồng nhau trong ElasticSearch/NEST?

public class Entity : DynamicObject 
{ 
     public string Id { get; set; } 
     // a bunch of other simple properties 

     public override IEnumerable<string> GetDynamicMemberNames() 
     { 
       return Data.Select(x => x.Name); 
     } 

     public override bool TryGetMember(GetMemberBinder binder, out object result) 
     { 

      var dictionary = Data.First(x => x.Name == binder.Name); 
      result = dictionary; 
      return true; 
     } 

     // each instance of one these should be a nested object type 
     public IList<NestedType> Data { get; set; } 

     public class NestedType 
     { 
      // How do I make Name be the nest type name? 
      public string Name { get; set; } 
      public IDictionary<string, string> Values { get; set; } 
     } 
} 

Tôi muốn tạo đối tượng lồng nhau/loại cho từng trường hợp của NestedType. Vì vậy, nếu có hai trường hợp của NestedType, thì sẽ có hai đối tượng lồng nhau. Tôi có thể kế thừa NestedType từ DynamicObject để biến từ điển thành các thuộc tính "thực" mà NEST sau đó ánh xạ chính xác (tức là, biến từng từ điển thành một thuộc tính). Vấn đề là tôi không thể tìm ra cách đặt tên/kiểu của đối tượng lồng nhau.

Có hai cách để ánh xạ tên mà tôi biết: Thuộc tính ElasticType và giao diện thông thạo NestedObject. Vấn đề ở đây là có một kiểu đơn thể hiện nhiều kiểu đối tượng lồng nhau. Tôi có thể làm một số kiểu xây dựng thời gian chạy, nhưng tôi không muốn nếu tôi có thể tránh được nó.

Có cách nào để sử dụng phương thức hoặc thuộc tính làm tên/loại đối tượng lồng nhau không? Hoặc là có một cách tiếp cận tốt hơn để lập bản đồ loại dữ liệu này để ElasticSearch (hy vọng thông qua NEST)?

Cảm ơn! Erick

EDIT

tôi cập nhật các định nghĩa thực thể để phản ánh những gì tôi đang làm (sử dụng DynamicObject để có được những JsonSerializer làm những gì tôi muốn). Những gì tôi muốn là khả năng cho các từ điển khác nhau có ánh xạ khác nhau, (khác nhau bắt nguồn, phân tích, vv). Nếu có các loại thích hợp, tôi có thể sử dụng cú pháp thông thạo NEST để thiết lập, nhưng khi sử dụng động, không có loại API thông thạo nào để sử dụng. Cuối cùng, tôi muốn kết hợp API thông thạo với một chuỗi dựa trên các chuỗi thay vì các loại. Điều này có nghĩa không?

+0

bạn có thể cung cấp ví dụ về đầu vào và những gì bạn mong đợi có trong ES không? thx –

+0

Một ánh xạ mẫu sẽ hữu ích. Bạn có thể cho chúng tôi một thuộc tính chuyển đổi json tùy chỉnh, chẳng hạn như: http://stackoverflow.com/questions/29173196/c-sharp-json-serialization-use-value-instead-of-property-name – Calle

Trả lời

5

Nếu tôi hiểu chính xác ý định của bạn, đối tượng Entity sẽ chỉ có các đối tượng lồng nhau trong đó, phải không?

Bạn có thể thử sử dụng chức năng dynamic mapping của elasticsearch cho đối tượng thực thể. Tôi cho rằng thực thể là một đối tượng gốc.

curl -X POST localhost:9200/myindex/entity/_mapping 
{"dynamic_templates": [ 
    {"nested_data_template": { 
     "mapping": { 
      "type": "nested" }, 
     "match_mapping_type": "object", 
     "path_match": "*" }}]} 

path_match: *match_mapping_type: object có nghĩa là cho tất cả các tên trường với đối tượng như một giá trị lồng bản đồ loại sẽ được áp dụng.

Sử dụng API NEST và Fluent, bạn có thể sử dụng API sau. IntelliSense sẽ hướng dẫn bạn cách xây dựng bản đồ ở trên. ;)

descriptor.DynamicTemplates(DynamicTemplatesDescriptor<Entity>) 

Mỗi khi một thuộc tính mới phù hợp với mẫu này xuất hiện, elasticsearch sẽ cập nhật ánh xạ dựa trên ánh xạ động. Sau một thời gian, ánh xạ của bạn sẽ trông giống như:

{ 
    "entity": { 
    "mappings": { 
     "entity": { 
     "dynamic_templates": [ 
      { 
      "nested_data_template": { 
       "mapping": { 
       "type": "nested" 
       }, 
       "match_mapping_type": "object", 
       "path_match": "*" 
      } 
      } 
     ], 
     "properties": { 
      "test": { 
      "type": "nested", 
      "properties": { 
       "test": { 
       "type": "string" 
       }, 
       "another_property": { 
       "type": "string" 
       } 
      } 
      }, 
      "test1": { 
      "type": "nested", 
      "properties": { 
       "test": { 
       "type": "string" 
       } 
      } 
      } 
     } 
     } 
    } 
    } 
} 

Hy vọng điều này sẽ hữu ích!

+0

Ah, tôi không biết về phương thức mẫu động. Điều này giúp tôi tiến lên - cảm ơn! –

Các vấn đề liên quan