2017-02-16 8 views
1

Я изучаю инструмент базы данных, и я не совсем уверен, как Elastic может справиться с моими требованиями.Elastic search deep tree model

У меня есть структура данных дерева, генеалогическое древо.

Корень - это первый человек Адам, а потом его дети, дети и так далее.

Элементы выглядит следующим образом (не заботятся о брачных отношениях эти данные только, чтобы получить идею):

{ 
    id: 1 
    name: “Adam” 
    parentId: 0 
}, { 
    id: 2 
    name: “Cain” 
    parentId: 1 
}, { 
    id: 3 
    name: “Abel” 
    parentId: 1 
}, { 
    id: 4 
    name: “johnny(Cain junior)” 
    parentId: 2 
}, … { 
    id: 12324568 
    name: “Cain b” 
    parentId: 1434 
} 

запросов Я хотел бы EXEC:

  1. «полный текст 'поиск по имени элемента, ответ должен включать документы и путь к ним. Например, поиск «Каина» должен воспроизводиться:

    a. Adam/Cain

    b. ../David/Danny/Cain б

  2. CRUD человека по идентификатору (Идентификаторы являются уникальными)

  3. Получить родословную по идентификатору, ответит иерархическое дерево (вложенное JSON), от «ид» как корень

  4. Дерево около ~ 20-30 уровня вложенности, до 10000 элементов

Наконец, мой вопрос:

  1. Может ли elasticsearch предоставить мне эту функциональность?

  2. Должен ли я использовать родительскую/дочернюю схему?

  3. Как должно выглядеть картографирование индекса.

ответ

1

Чтобы ответить на ваши вопросы:

3) Ваше отображение индекса может выглядеть следующим образом:

{ 
    "mappings": { 
    "my_index": { 
     "properties": { 
     "id": { 
      "type": "integer", 
      "fielddata": true <-- you need this if you're using this field for aggregations 
     }, 
     "parentId": { 
      "type": "integer" 
     }, 
     "name": { 
      "type": "text" <-- can be text/keyword depending on your requirement 
     } 
     } 
    } 
    } 
} 

2) Я хотел бы предложить вам использовать parent-child отображение, так что вы можете имеют отношение один-ко-многим. Elasticsearch поддерживает карту того, как родители соответствуют своим дочерним элементам, а запросы - время быстро связано с этим отображением. Вы могли бы прочитать об этом SO, чтобы узнать контрольный показатель сопоставления родитель-ребенка над вложенным.

1) Вы всегда можете сделать full text поиск до тех пор, пока у вас есть отображение тип для поля в качестве текста. This должен помочь вам определить разницу в использовании типа text за keyword. Вы могли бы добавить один документ в свой индекс, иначе вы можете пойти с добавлением bulk, содержащим несколько документов.Это идет рука об руку с другими операциями CRUD. Я все еще не знаю, как будет реагировать иерархическое дерево, когда вы запрашиваете документы родительским идентификатором.

Надеюсь, это поможет!

+0

Благодаря @Darth_Vader, он помогает после прочтения вашего ответа я должен следить за вопросом: как я могу использовать родитель/ребенок здесь, Если я правильно понял, это не позволяет создавать н уровне дерева одного и те же типа "my_index"? Может (темная сторона) Сила с вами :) – Ilan