我试图使用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获取所有度量标准,那将是什么样的?
答案 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>
。