2016-09-22 5 views
0

Я хотел бы, чтобы отобразить следующую структуру: - У меня есть записи блог - Публикации могут иметь комментарии - Комментарии могут иметь ответы (которые также комментарии), поэтому она должна быть рекурсивная структура данныхElasticsearch Уплотненный Родитель-Ребенок отображение

POST ----- * -> К.П

К.П ----- * ---> К.П

Вот что я пробовал:

mappings: { 
    "comment": { 
     "properties": { 
      "content": { "type": "string" }, 
      "replies": { "type": "comment" } 
     } 
    }, 
    "post": { 
     "properties": { 
      "comments": { 
        "type": "comment" 
      } 
     } 
    } 
} 

Конечно, это не работает. Как я могу это достичь?

ответ

1

Вы пытаетесь объявить типы, как это было бы при программировании OO, это не так, как это работает в ES. Вы должны использовать parent-child relationships, как показано ниже, то есть post не имеет поля comments, но тип отображения comment имеет поле метаданных _parent, ссылающееся на родительский тип post.

Также для моделирования ответов я предлагаю просто иметь другое поле под названием in_reply_to, которое будет содержать идентификатор комментария, к которому относится ответ. Гораздо проще!

PUT blogs 
{ 
    "mappings": { 
    "post": { 
     "properties": { 
     "title": { "type": "string"} 
     } 
    }, 
    "comment": { 
     "_parent": { 
     "type": "post" 
     }, 
     "properties": { 
     "id": { 
      "type": "long" 
     } 
     "content": { 
      "type": "string" 
     }, 
     "in_reply_to": { 
      "type": "long" 
     } 
     } 
    } 
    } 
} 
+0

Кажется законными. Ответ на комментарий также можно рассматривать как ответ на сообщение. Поле 'in_reply_to' присоединяет ответы к комментариям. Благодаря! – maestro

+0

Удивительный, рад, что это помогло! – Val

0
mappings: { 
    "post": { 
     "properties": { 
      "content": { "type": "string" }, 
      "comment": { 
       "properties" : { 
        "content": { "type": "string" }, 
        "replies": { 
         "properties" : { 
          "content": { "type": "string" } 
         } 
        } 
     } 
    } 
} 
+0

ответы могут также иметь ответы – maestro

+0

В этом случае добавьте еще один уровень иерархии, такой же как комментарий, или вы можете использовать подход родительского сопоставления, если у вас больше уровней (https://www.elastic.co/guide/en/elasticsearch/reference/current /mapping-parent-field.html) –

+0

Из связанной документации: '" Родительский и дочерний типы должны быть разными - отношения между родителями и дочерними элементами не могут быть установлены между документами того же типа. "' – maestro

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