映射到多态列表

时间:2014-01-22 06:31:03

标签: elasticsearch nest

我是ElasticSearch的新手,并尝试在我的C#应用​​程序中使用它。我有一个类,它包含一个基类型列表,其中包含从中继承的类:

public class Automobile
{
    public string ModelName { get; set; }
    public double EngineSize { get; set; }
}

public class Truck : Automobile
{
    public double CarryWeight { get; set; }
}

public class Car : Automobile
{
    public short SaftyStars { get; set; }
}

public class MotorCycle : Automobile
{
    public double DecibleNoise { get; set; }
}

public class AutoDealerShip
{
    public string Name { get; set; }
    [ElasticProperty(Type = FieldType.nested)]
    public IList<Automobile> Models { get; set; }

    public AutoDealerShip()
    {
        Models = new List<Automobile>();
    }
}

我正在尝试映射该类,以便保存实际对象:

ElasticClient.MapFluent<AutoDealerShip>(m => m.MapFromAttributes().
                                             Properties(prop => prop.
                                             NestedObject<Automobile>(n => n.
                                                 Name(p => p.
                                                 Models.First()).
                                                      MapFromAttributes().
                                                      Dynamic())));

尝试索引数据并检索它时:

private static void IndexPolymorphicObject()
{
    ElasticClient.DeleteIndex(PersonIndex);

    var dealerShip = new AutoDealerShip();
    dealerShip.Name = "Mikes dealership";
    dealerShip.Models.Add(new Truck());
    dealerShip.Models.Add(new Car());
    dealerShip.Models.Add(new MotorCycle());
    ElasticClient.Index(dealerShip);
    ElasticClient.Flush();
}

private static void GetPolyMorphicData()
{
    var result = ElasticClient.Search<AutoDealerShip>(srch => srch.
                                               Query(q => q.MatchAll()));
    var dealerShip = result.Documents.First();
    foreach (var automobile in dealerShip.Models)
    {
        Console.WriteLine("Automobile of type {0}",automobile.GetType());
    }
}

我不断收回 AutoMobile 类型的对象。有没有办法使用nest存储多态数据?

谢谢,

以斯哈

1 个答案:

答案 0 :(得分:4)

默认情况下,NEST非常支持您存储的文档的逆变结果

所以,如果你这样做

Index<B>()

Index<C>()

Index<D>()

然后搜索Search<A>(s=>s.Types(B,C,D)),因为它们都是从A派生出来的,你将获得一个IEnumerable结果,其中包含B,C和D的实际实例。

要在自己的文档中获得对抗/协方差,您必须自己进行连线。

您必须在属性上注册自定义jsonconverter,以确保JSON.net将json反序列化为实际的子类型而不是晚餐。