11

NEST を使用しようとしていますが、このクラスと一緒に使用する方法がわかりません

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

このようなクラスで新しい流暢なマッピングを使用するにはどうすればよいですか?

私はこれが好きです:

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

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

辞書に対してクエリを作成することはできますか? キー名が「visits」の mesurenemt を使用して、昨日からすべてのメトリックを取得したい場合、どのように表示されますか?

4

1 に答える 1

12

マッピングを使用しない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ディクショナリにvisitsキーを持つ最初の 10 個のメトリックを保持するようになりました。Measurement

新しい流暢なマッピングを使用して、そのディクショナリで可能なキーを明示的にマッピングする場合:

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(NumberType.@integer)
                )
                .String(ps => ps
                    .Name("url")
                    .Index(FieldIndexOption.not_analyzed))
                )
            )
        )
    )
);

このマッピングを使用して動的マッピングをオフにしていないことに注意してください。したがって、elasticsearch を混乱させることなく、他のキーを辞書に挿入できます。エラスティックサーチは、訪問数が実際の整数であることを認識し、URL 値を分析したくありません。

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

于 2013-01-06T11:03:05.570 に答える