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使用映射,在这种情况下你可以很好地依赖弹性搜索的无模式特性。

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 回答