我是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存储多态数据?
谢谢,
以斯哈
答案 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反序列化为实际的子类型而不是晚餐。