2014-10-14 2 views
1

У меня есть следующее индексный документ лицо:Как индексация и поиск вложенных свойств типа интерфейса в NEST

[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 (Поставщик)) никогда не верны. Параметр existingValue имеет значение null в этом методе, поэтому у меня нет опции, как определить правильный тип.

ПРИМЕЧАНИЕ: мои объекты (поставщик, поставщик) находятся в отдельной dll (плагин), и я не имею прямого доступа к ним при определении документа.

Можете ли вы посоветовать, что я делаю неправильно, или дать мне совет по лучшей практике, как бороться с интерфейсом или абстрактным классом внутри индекса документа и как бороться с полиморфизмом?

спасибо большое!

ответ

0

Эта информация потеряна, вам нужно будет проверить JSON, чтобы обеспечить дифференциатор.

Для ударов сами NEST могут использовать _type в качестве дифференциатора. Для коллекций внутри вашего документа вам придется либо написать jsonconverter для создания правильного типа на основе свойства, либо дать указание Json.NET написать эту информацию для вас при автоматическом сериализации.

Смежные вопросы