2013-01-05 3 views
8

Im cố gắng sử dụng NEST và can't tìm ra cách để sử dụng nó cùng với lớp nàyNEST lập bản đồ của Dictionary <string, object>

public class Metric { 
    public DateTime Timestamp { get; set; }  
    public Dictionary<string,object> Measurement { get; set; } 
} 

Làm thế nào để tôi sử dụng các bản đồ thành thạo mới với một lớp học như điều này?

Im kế hoạch để sử dụng i thích này:

var mesurements = new Dictionary<string, object>(); 
mesurements["visits"] = 1; 
mesurements["url"] = new string[] {"/help", "/about"}; 

connection.Index(new Metric() { 
     Timestamp = DateTime.UtcNow, 
     Measurement = mesurements 
}); 

Liệu nó có thể viết một truy vấn đối với từ điển? Nếu tôi muốn nhận được tất cả các số liệu từ ngày hôm qua với một mesurenemt với một tên chính "thăm", nó sẽ như thế nào?

Trả lời

11

Bạn không have để sử dụng ánh xạ, bạn có thể dựa vào bản chất schemaless của elasticsearch thực sự tốt trong trường hợp này.

Các serializer json sẽ viết rằng hiện như:

{ 
    "timestamp" : "[datestring]", 
    "measurement" : { 
     "visits" : 1, 
     "url" : [ "/help", "/about"] 
    } 
} 

Bạn có thể truy vấn cho sự tồn tại của "measurement.visits" lĩnh vực như vậy sử dụng NEST.

var result = client.Search<Metric>(s=>s 
    .From(0) 
    .Size(10) 
    .Filter(filter=>filter 
     .Exists("measurement.visits") 
    ) 
); 

result.Documents nay giữ 10 số liệu đầu tiên với một chìa khóa visits trong từ điển Measurement.

Nếu bạn muốn để ánh xạ một cách rõ ràng các phím có thể trong từ điển rằng việc sử dụng các bản đồ thành thạo mới:

var result = client.MapFluent<Metric>(m => m 
    .Properties(props => props 
     .Object<Dictionary<string,object>>(s => s 
      .Name(p => p.Measurement) 
      .Properties(pprops => pprops 
       .Number(ps => ps 
        .Name("visits") 
        .Type([email protected]) 
       ) 
       .String(ps => ps 
        .Name("url") 
        .Index(FieldIndexOption.not_analyzed)) 
       ) 
      ) 
     ) 
    ) 
); 

Hãy nhớ rằng chúng tôi đã không tắt lập bản đồ năng động sử dụng bản đồ này để bạn vẫn có thể chèn các phím khác vào từ điển của bạn mà không làm phiền elasticsearch. Chỉ bây giờ elasticsearch sẽ biết thăm là một số nguyên thực tế và chúng tôi không muốn phân tích các giá trị url.

vì chúng tôi không sử dụng bất kỳ trình truy cập đã nhập nào (Cuộc gọi .Name() được nhập vào Metric) .Object<Dictionary<string,object>> cũng có thể là .Object<object>.