# Logstashで３階層のデータを生成したい

**URL:** <https://discuss.elastic.co/t/logstash/270717>\
**Category:** 日本語による質問・議論はこちら\
**Created:** [April 20, 2021, 1:49pm UTC](https://discuss.elastic.co/t/logstash/270717 "2021-04-20T13:49:07Z")\
**Posts on this page:** 2\
**Page:** 1

<div class="post-metadata">

**Author:** ![atsuizo](https://avatars.discourse-cdn.com/v4/letter/a/d26b3c/32.png) [@atsuizo](https://discuss.elastic.co/u/atsuizo)\
**Post date:** [April 20, 2021, 1:49pm UTC](https://discuss.elastic.co/t/logstash/270717/1 "2021-04-20T13:49:07Z")

</div>

RDBMS上に３階層で構成されている表のデータを、  
３階層のドキュメント構造でElasticsearchに反映させたいと考えています。

ほぼ以下のURLで語られているとおりなのですが、  
このトピックのやりとりで解決したのかまでが不明で、  
参考にして設定しても期待した形を実現できなかったため  
質問させて下さい。

> [@Jdbc\_streaming with nested elements](https://discuss.elastic.co/t/jdbc-streaming-with-nested-elements/172208):
>
> Hi, I have 3 tables that has the described connections: A-\>B-\>C Basically i have FK from A to B and B to C. I'm trying to put all the data into a unique document with a list of B inside A and a list of C inside B. This is possible? I'm using jdbc\_streaming to put the B elements into the A, but how do i put the C elements inside the B?? here is an example what i doing: input { jdbc { jdbc\_driver\_library =\> "driver" jdbc\_driver\_class =\> "com.ibm.db2.jcc.DB2Driver"…

【RDBMS（MySQL）上の構造、データ】  
表A-\>表B-\>表Cの３階層  
表A-\>表Bは、1:N  
表B-\>表Cは、1:N  
表Bには表AのIDを持つ列がある  
表Cには表BのIDを持つ列がある

【Elasticsearch上で実現したいこと】  
以下のようなドキュメント構造でデータを保持したい。

```
{
 "表AのID" : "表AのIDの値",
 "表AのID以外の列" : "表AのID以外の列の値",
 "表B情報" : [
  {
   "表BのID" : "表BのIDの値",
   "表BのID以外の列" : "表BのID以外の列の値",
   "表Cの情報" : [
    {
     "表CのID" : "表CのIDの値",
     "表CのID以外の列" : "表CのID以外の列の値",
    }
   ]
  }
 ]
}

```

【Logstashの設定】

input jdbcプラグイン  
表Aを更新日時のタイムスタンプで差分クロール

filter  
（１）jdbc\_streamingで表Bをクロール。  
表B.表AのID情報列 = 表Aから取得したID値 を検索条件

（２）jdbc\_streamingで表Cをクロール。  
表C.表BのID情報列 = 表B（（１）のjdbc\_streaming）から取得したID値 を検索条件  
・・・にしたいが、できなかったので、  
表Aと表Bと表CをJOINした上で、表B.表AのID情報列 = 表A（input - JDBC）から取得したID値を検索条件に指定

output  
elasticsearch  
特別な設定無し。

先のURLを参考に  
filter（１）にtarget=\>"表B情報"  
filter（２）にtarget=\>"[表B情報][表C情報]"  
のように書くと、表Cの情報は一切反映されませんでした。（表Bの情報までが反映される）

filter（１）にtarget=\>"[表B情報][表B情報]"  
filter（２）にtarget=\>"[表B情報][表C情報]"  
のように書くと、表Cの情報は反映されるものの、表Bの情報の構造が期待したものにならず、  
以下のようになります。

```
{
 "表AのID" : "表AのIDの値",
 "表AのID以外の列" : "表AのID以外の列の値",
 "表B情報" : [
  {
   "表Bの情報" : [
    {
     "表BのID" : "表BのIDの値",
     "表BのID以外の列" : "表BのID以外の列の値",
    }
   ],
   "表Cの情報" : [
    {
     "表CのID" : "表CのIDの値",
     "表CのID以外の列" : "表CのID以外の列の値",
    }
   ]
  }
 ]
}

```

（Q1）前述のようなドキュメント構造で３階層のデータを反映する方法がありましたら教えて下さい。

（Q2）jdbc\_streaming内のSQLで取得した情報を別のjdbc\_streamingのパラメータとして使用することは、仕様上できないのでしょうか？

【環境】  
Elasticsearch：7.9.1  
Logstash：7.12.0 - OSS Only

---

<div class="post-metadata">

**Author:** ![system](https://us1.discourse-cdn.com/elastic/original/3X/1/a/1ac57faf039f6b580b3f104ef42a2a89e41014de.png) [@system](https://discuss.elastic.co/u/system)\
**Post date:** [May 18, 2021, 1:49pm UTC](https://discuss.elastic.co/t/logstash/270717/2 "2021-05-18T13:49:56Z")

</div>

This topic was automatically closed 28 days after the last reply. New replies are no longer allowed.
