【问题标题】:NEST mapping of Dictionary<string,object>Dictionary<string,object> 的 NEST 映射
【发布时间】:2012-12-20 01:38:51
【问题描述】:

我正在尝试使用 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 获取昨天的所有 Metrics,那会是什么样子?

【问题讨论】:

    标签: elasticsearch nest


    【解决方案1】:

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

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

    因为我们没有使用任何类型的访问器(.Name() 调用被键入到 Metric.Object&lt;Dictionary&lt;string,object&gt;&gt; 也可能是 .Object&lt;object&gt;

    【讨论】:

      猜你喜欢
      • 2017-05-21
      • 2015-10-27
      • 2011-06-17
      • 1970-01-01
      • 2012-03-01
      • 2016-07-08
      • 2014-10-22
      • 2012-05-13
      • 2015-04-21
      相关资源
      最近更新 更多