ElasticSearch.NET - Индексирование родительских / дочерних узлов в разных индексах - PullRequest
0 голосов
/ 11 октября 2019

Я пытаюсь следовать этому руководству при создании родительско-дочерних отношений между элементами;

https://www.elastic.co/guide/en/elasticsearch/client/net-api/master/parent-child-relationships.html

Мой вариант использования немного отличается, поскольку в учебнике создается родитель / потомокотношения между элементами в одном и том же индексе, того же типа. Я хочу создать один из двух разных типов объектов, которые должны храниться в разных индексах. Я придумал что-то вроде этого;

class MyParentType
{
    public int Id {get;set;}
    public string Data {get;set;}
    public JoinField MyJoinField { get; } = typeof(MyParentType);
}

class MyChildType
{
    public int Id {get;set;}
    public string Data {get;set;}
    public JoinField ParentJoinField { get; set; }

    public MyChildType(MyParentType parent)
    {
        ParentJoinField = JoinField.Link<MyChildType, MyParentType>(parent);
    }
}

public static void Main(string[] args)
{
    var connectionSettings = new ConnectionSettings(
            pool, (builtin, settings) => new JsonNetSerializer(builtin, settings,
                () => new JsonSerializerSettings { Converters = { new StringEnumConverter() } }))
        .DefaultMappingFor<MyParentType>(m => m.IndexName("parents_index"))
        .DefaultMappingFor<MyChildType>(m => m.IndexName("children_index").RelationName("parents"));

    var client = new ElasticClient(connectionSettings);

    client.CreateIndex("parents_index", c => c
        .Index<MyParentType>()
        .Mappings(m => m.Map<MyParentType>(n => n
            .RoutingField(r => r.Required())
            .AutoMap<MyParentType>())));

    client.CreateIndex("children_index", c => c
        .Mappings(m => m.Map<MyChildType>(n => n
            .RoutingField(r => r.Required())
            .AutoMap<MyChildType>()
            .Properties(props => props
                .Join(j => j
                    .Name(l => l.ParentNoteJoinField)
                    .Relations(r => r
                        .Join<MyParentType, MyChildType>()))))));

    var descriptor = new BulkDescriptor();
    descriptor.IndexMany(GetSomeCollectionOfParents());
    var response = client.Bulk(descriptor);
}

Однако последняя строка возвращает ошибочный ответ от ElasticSearch;

операция [0]: индекс вернул 400 _index: parent_index _type: myparenttype _id: 123 _version: 0 ошибка: Тип: mapper_parsing_exception Причина: «сопоставление объектов для [myJoinField] попыталось проанализировать поле [myJoinField] как объект, но обнаружило конкретное значение»

Может кто-нибудь пожалуйстаукажите, что я делаю не так?

1 Ответ

0 голосов
/ 11 октября 2019

Кажется, мне не нужно никаких JoinField для моего родительского объекта. Это должно быть больше так:

class MyParentType
{
    public int Id {get;set;}
    public string Data {get;set;}
}

И индексирование;

client.CreateIndex("parents_index", c => c
    .Index<MyParentType>()
    .Mappings(m => m.Map<MyParentType>(n => n
        .AutoMap<MyParentType>())));

client.CreateIndex("children_index", c => c
    .Index<MyChildType>()
    .Mappings(m => m.Map<MyChildType>(n => n
        .RoutingField(r => r.Required())
        .AutoMap<MyChildType>()
        .Properties(props => props
            .Join(j => j
                .Name(l => l.ParentNoteJoinField)
                .Relations(r => r
                    .Join<MyParentType, MyChildType>()))))));

Это похоже на работу, и я получаю индексированный дочерний объект, подобный этому;

{
  "_source": {
    "id": "1",
    "parentJoinField": {
      "name": "parents",
      "parent": "123"
    },
  }
}
...