2017-05-11 6 views
2

Supposons qu'il existe un index de blog simple qui contient deux types: blog et commentaire. Un blog peut avoir plusieurs commentaires. L'indice est créé comme celui-ciElasticsearch: Relation parent-enfant après le retournement

curl -X PUT \ 
    'http://localhost:9200/%3Cblog-%7Bnow%2Fd%7D-000001%3E?pretty=' \ 
    -H 'content-type: application/json' \ 
    -d '{ 
    "mappings": { 
     "comment": { 
      "_parent": { "type": "blog" }, 
      "properties": { 
       "name": { "type": "keyword" }, 
       "comment": { "type": "text" } 
      } 
     }, 
     "blog": { 
      "properties": { 
       "author": { "type": "keyword" }, 
       "subject": { "type": "text" }, 
       "content": { "type": "text" } 
      } 
     } 
    } 
}' 

L'indice %3Cblog-%7Bnow%2Fd%7D-000001%3E est égal à <blog-{now/d}-000001> (voir here pour plus sur les mathématiques de date). Nous allons ajouter l'alias 'blog-active' à cet index. Cet alias va être utilisé pour stocker des données.

curl -X POST 'http://localhost:9200/_aliases?pretty=' \ 
    -H 'content-type: application/json' \ 
    -d '{ "actions" : [ { "add" : { "index" : "blog-*", "alias" : "blog-active" } } ] }' 

Maintenant, si nous faisons les actions suivantes:

1.AJOUT un blog en utilisant blog-active alias

curl -X POST http://localhost:9200/blog-active/blog/1 \ 
    -H 'content-type: application/json' \ 
    -d '{ 
     "author": "author1", 
     "subject": "subject1", 
     "content": "content1" 
    }' 

2.Ajoutez un commentaire sur le blog

curl -X POST \ 
    'http://localhost:9200/blog-active/comment/1?parent=1' \ 
    -H 'content-type: application/json' \ 
    -d '{ 
    "name": "commenter1", 
    "comment": "new comment1" 
}' 

3 .Faire un survol avec max_docs = 2

curl -X POST \ 
    http://localhost:9200/blog-active/_rollover \ 
    -H 'content-type: application/json' \ 
    -d '{ 
    "conditions": { 
    "max_docs": 2 
    }, 
    "mappings": { 
    "comment": { 
     "_parent": { "type": "blog" }, 
     "properties": { 
     "name": { "type": "keyword" }, 
     "comment": { "type": "text" } 
     } 
    }, 
    "blog": { 
     "properties": { 
     "author": { "type": "keyword" }, 
     "subject": { "type": "text" }, 
     "content": { "type": "text" } 
     } 
    } 
    } 
}' 

4. Et ajouter un autre commentaire au blog

curl -X POST \ 
    'http://localhost:9200/blog-active/comment/1?parent=1' \ 
    -H 'content-type: application/json' \ 
    -d '{ 
    "name": "commenter2", 
    "comment": "new comment2" 
}' 

Maintenant, si nous cherchons tous les indices de blog pour tous les commentaires sur les blogs 'de Auteur1' avec (blog-%2A est blog-*)

curl -X POST \ 
    http://localhost:9200/blog-%2A/comment/_search \ 
    -H 'content-type: application/json' \ 
    -d '{ 
    "query": { 
     "has_parent" : { 
     "query" : { 
      "match" : { "author" : { "query" : "author1" } } 
     }, 
     "parent_type" : "blog" 
     } 
    } 
}' 

la résultat ne contient que le premier commentaire.

Ceci est dû au fait que le second commentaire est dans le second index qui n'a pas de document de blog parent en lui-même. Donc, il ne connaît pas l'auteur du blog.

blog indices

Alors, ma question est de savoir comment abordez-je les relations parent-enfant lorsque le remplacement est utilisé?

La relation est-elle même possible dans ce cas?

question similaires: ElasticSearch parent/child on different indexes

Répondre

0

Tous les documents qui font partie d'une relation parent-enfant a besoin de vivre dans le même indice, plus précieusement même tesson. Il n'est donc pas possible d'avoir une relation parent-enfant si le rollover est utilisé, car il crée de nouveaux index. Une solution au problème ci-dessus pourrait être de dénormaliser les données en ajoutant les champs blog_author et blog_id au type comment. La cartographie dans ce cas ressemblera à ceci (notez que la relation parent-enfant a été supprimé):

"mappings": { 
    "comment": { 
    "properties": { 
     "blog_id": { "type": "keyword" }, 
     "blog_author": { "type": "keyword" }, 
     "name": { "type": "keyword" }, 
     "comment": { "type": "text" } 
    } 
    }, 
    "blog": { 
    "properties": { 
     "author": { "type": "keyword" }, 
     "subject": { "type": "text" }, 
     "content": { "type": "text" } 
    } 
    } 
} 

et la requête pour récupérer les commentaires de l'auteur du blog est:

curl -X POST \ 
    http://localhost:9200/blog-%2A/comment/_search \ 
    -H 'cache-control: no-cache' \ 
    -H 'content-type: application/json' \ 
    -d '{ 
    "query": { 
    "match": { 
     "blog_author": "user1" 
    } 
    } 
}'