2013-01-05 14 views
8

イムNESTを使用しようと私のようなクラスを使用して新しい流暢なマッピングを使用するにはどうすればよいNESTマッピング<文字列、オブジェクト>

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

このクラスと一緒にそれを使用する方法を見つけ出すcan'tこの?

イム計画は、使用する私はこれを好む:

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

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

辞書に対してクエリを記述することは可能でしょうか?私が昨日Metricsをキー名「訪問者」と一緒に取得したい場合、どのように見えるでしょうか?

答えて

11

マッピングを使用するにはhaveを使用しないでください。この場合、elasticsearchのスキルレスの性質が本当にうまく当てはまります。

JSONシリアライザのようにそれを書き出します:

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

あなたはとてもNESTを使用してのような「measurement.visits」フィールドが存在するかどうかを問い合わせることができます。

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

result.Documentsは今Measurement辞書でvisitsキーで最初の10個の指標を保持します。

明示的に新しい流暢なマッピングを使用して、その辞書で可能なキーをマップ化したいなら:あなたはまだに他のキーを挿入することができるように

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

たちは、このマッピングを使用して動的マッピングをオフにしていないことに注意してくださいあなたの辞書は、elasticsearchを怒らせることなく。今度はelasticsearchが訪問数が実際の整数であることを知り、URL値を分析したくない。

.Object<object>でも、型付きアクセサーを使用していないため(.Name()呼び出しはMetricにタイプされています).Object<Dictionary<string,object>>も可能です。

関連する問題