2016-09-22 2 views
0

Ich mag würde die folgende Struktur abzubilden: - Ich habe Blog-Beiträge - Blog-Artikel Kommentare haben können - Kommentare können Antworten haben (welche auch Kommentare), so dass es eine sein sollte, rekursive DatenstrukturElasticsearch Nested Parent-Child-Mapping

POST ----- * -> KOMMENTAR

KOMMENTAR ----- * ---> KOMMENTAR

Hier ist, was ich versucht:

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

Natürlich funktioniert es nicht. Wie kann ich das erreichen?

Antwort

1

Sie versuchen, die Typen so zu deklarieren, wie Sie es in der OO-Programmierung tun würden, so funktioniert das in ES nicht. Sie müssen parent-child relationships wie unten verwenden, d. H. post hat kein Feld mit der Bezeichnung comments, aber der comment Mapping-Typ hat ein _parent Meta-Feld, das den post übergeordneten Typ referenziert.

Auch um Antworten zu modellieren, schlage ich vor, einfach ein anderes Feld namens in_reply_to zu haben, das die ID des Kommentars enthalten würde, auf den sich die Antwort bezieht. Viel einfacher so!

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

scheint echt zu sein. Eine Antwort auf einen Kommentar kann auch als Antwort auf einen Beitrag angesehen werden. Das 'in_reply_to'-Feld verbindet die Antworten zu den Kommentaren. Vielen Dank! – maestro

+0

Super, froh, dass es geholfen hat! – Val

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

Antworten können auch Antworten haben – maestro

+0

In diesem Fall fügen Sie eine weitere Ebene der Hierarchie wie Kommentar hinzu oder Sie können Eltern-Mapping-Ansatz verwenden, wenn Sie mehr Ebenen haben (https://www.elastic.co/guide/en/elasticsearch/reference/current /mapping-parent-field.html) –

+0

Aus der verknüpften Dokumentation: "" Die Eltern- und Kindtypen müssen unterschiedlich sein - Eltern-Kind-Beziehungen können nicht zwischen Dokumenten desselben Typs hergestellt werden. "' – maestro