2017-05-11 5 views
2

単純なブログインデックスがあり、ブログとコメントの2種類があるとします。 1つのブログは複数のコメントを持つことができます。インデックスは、インデックス%3Cblog-%7Bnow%2Fd%7D-000001%3Eこの弾性検索:ロールオーバー後の親子関係

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" } 
      } 
     } 
    } 
}' 

ように作成された(日付の計算に関する詳細についてhereを参照)<blog-{now/d}-000001>に等しいです。 このインデックスに 'blog-active'エイリアスを追加します。このエイリアスはデータの格納に使用されます。

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

今、私たちは、次の操作を行う場合:

1.Add blog-active別名

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

2.Addブログ

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

3へのコメントを使ってブログを。max_docs = 2のロールオーバーを行う

私たちが持つ「author1のブログ上のすべてのコメントのためのすべてのブログのインデックスを検索する場合
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.And(blog-%2Ablog-*ある)

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

今すぐブログへ

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" 
     } 
    } 
}' 

別のコメントを追加結果には最初のコメントのみが含まれます。

これは、2番目のコメントが親ブログ文書を持たない2番目のインデックスにあるためです。だから、それはブログの作者については知らない。

blog indices

だから、私の質問は、ロールオーバーを使用する場合、私は親子関係に近づく行う方法ですか?

この場合でも関係はありますか?

同様の質問:親子関係の一部を形成ElasticSearch parent/child on different indexes

答えて

0

すべての文書は、より大事同じインデックス、同じシャードに住んでする必要があります。したがって、新しいインデックスを作成するので、ロールオーバーが使用される場合、親子関係を持つことはできません。

上記の問題に対する1つの解決方法は、とblog_idcommentタイプに追加することによってデータを非正規化することでした。このようになります。その場合のマッピング(つまり親子関係を気づくには削除されました):

"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" } 
    } 
    } 
} 

やブログの作者のコメントを取得するクエリは、次のとおりです。

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" 
    } 
    } 
}'