Dictionary <String,object> </string,object>的NEST映射

时间:2013-01-05 22:27:27

标签: elasticsearch nest

我试图使用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
});

是否可以针对字典编写查询?如果我想从昨天开始使用关键名称为“访问”的mesurenemt获取所有度量标准,那将是什么样的?

1 个答案:

答案 0 :(得分: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词典中使用Measurement键保留前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(NumberType.@integer)
                )
                .String(ps => ps
                    .Name("url")
                    .Index(FieldIndexOption.not_analyzed))
                )
            )
        )
    )
);

请记住,我们没有使用此映射关闭动态映射,因此您仍然可以将其他键插入字典而不会破坏elasticsearch。只有现在,elasticsearch才会知道访问是一个实际的整数,我们不想分析网址值。

因为我们没有使用任何类型的访问器(.Name()调用被输入Metric.Object<Dictionary<string,object>>也可能是.Object<object>