RDBMS上に3階層で構成されている表のデータを、
3階層のドキュメント構造でElasticsearchに反映させたいと考えています。
ほぼ以下のURLで語られているとおりなのですが、
このトピックのやりとりで解決したのかまでが不明で、
参考にして設定しても期待した形を実現できなかったため
質問させて下さい。
【RDBMS(MySQL)上の構造、データ】
表A->表B->表Cの3階層
表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
(1)jdbc_streamingで表Bをクロール。
表B.表AのID情報列 = 表Aから取得したID値 を検索条件
(2)jdbc_streamingで表Cをクロール。
表C.表BのID情報列 = 表B((1)のjdbc_streaming)から取得したID値 を検索条件
・・・にしたいが、できなかったので、
表Aと表Bと表CをJOINした上で、表B.表AのID情報列 = 表A(input - JDBC)から取得したID値を検索条件に指定
output
elasticsearch
特別な設定無し。
先のURLを参考に
filter(1)にtarget=>"表B情報"
filter(2)にtarget=>"[表B情報][表C情報]"
のように書くと、表Cの情報は一切反映されませんでした。(表Bの情報までが反映される)
filter(1)にtarget=>"[表B情報][表B情報]"
filter(2)に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)前述のようなドキュメント構造で3階層のデータを反映する方法がありましたら教えて下さい。
(Q2)jdbc_streaming内のSQLで取得した情報を別のjdbc_streamingのパラメータとして使用することは、仕様上できないのでしょうか?
【環境】
Elasticsearch:7.9.1
Logstash:7.12.0 - OSS Only