gpt4 book ai didi

elasticsearch - 如何在 NEST 中索引和搜索接口(interface)类型的嵌套属性

转载 作者:行者123 更新时间:2023-12-03 00:25:10 26 4
gpt4 key购买 nike

我有以下文档索引实体:

[ElasticType(Name = "Document", IdProperty = "Id")]
public class Document
{
[ElasticProperty(Index = FieldIndexOption.NotAnalyzed)]
public string Id { get; set; }

[ElasticProperty(Type = FieldType.Nested)]
public ICustomer Customer { get; set; }
}

其中 ICustomer 可以是不同的类型:
public interface ICustomer
{
}

public class Supplier : ICustomer
{
public string Name { get; set; }

//another properties
}

public class Vendor : ICustomer
{
public string Name { get; set; }

//another properties
}

我的映射是:
Client.CreateIndex("Document", c => c
.AddMapping<Document>(m => m
.SearchAnalyzer("standard")
.IndexAnalyzer("standard")
.MapFromAttributes()
.NumericDetection()
.DateDetection();

当我将文档保存到索引时,它还会保存正确序列化的嵌套对象(供应商或供应商)。

但是我在搜索数据时遇到了问题。我从 newtonsoft 收到以下异常:
Type is an interface or abstract class and cannot be instantiated.

我试图创建自定义 json 转换器
public class CustomJsonConvertor : JsonConverter
{
public override void WriteJson(JsonWriter writer, object value, JsonSerializer serializer)
{
serializer.Serialize(writer, value);
}

public override object ReadJson(JsonReader reader, Type objectType, object existingValue, JsonSerializer serializer)
{
if (objectType == typeof(Supplier))
{
return serializer.Deserialize(reader, typeof (Supplier));
}

if (objectType == typeof(Vendor))
{
return serializer.Deserialize(reader, typeof(Vendor));
}

throw new NotSupportedException(string.Format("Type {0} unexpected.", objectType));
}

public override bool CanConvert(Type objectType)
{
return objectType == typeof (Supplier) || objectType == typeof (Vendor);
}
}

并将其注册为:
settings.AddContractJsonConverters(t => typeof(ICustomer).IsAssignableFrom(t) ? new CustomJsonConvertor() : null);

但是后来我在 ReadJson 方法中收到异常,因为 objectType 的类型是 ICustomer 并且条件 if (objectType == typeof(Supplier)) 永远不会为真。此方法中的参数 existingValue 为 null,所以我没有选择如何确定
正确的类型。

注意:我的实体(供应商、供应商)位于单独的 dll(插件)中,并且在定义 Document 时我无法直接访问它们。

你能告诉我我做错了什么或者给我一些最佳实践建议如何处理文档索引中的接口(interface)或抽象类以及如何处理多态性?

多谢!

最佳答案

该信息丢失,您需要检查 JSON 以提供差异化​​。

对于命中本身,NEST 可以使用 _type作为差异化因素。对于文档中的集合,您必须编写 jsonconverter 以基于属性实例化正确的类型,或者指示 Json.NET 在自动序列化时为您编写该信息。

关于elasticsearch - 如何在 NEST 中索引和搜索接口(interface)类型的嵌套属性,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/26370724/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com