sshota
(shota)
September 20, 2019, 7:24am
1
お世話になります。
SearchAPIを使用して、Elasticsearchに貯めたデータを別システムへ連携しようとしています。
SearchAPIへのリクエストをプログラム化して、自動化するところまではできたのですが、
レスポンスのデータを操作するところでつまずいています。
_idを指定してリクエストしたところ、下記のレスポンスを取得できました。
{
"took": 407,
"timed_out": false,
"_shards": {
"total": 1,
"successful": 1,
"skipped": 0,
"failed": 0
},
"hits": {
"total": {
"value": 1,
"relation": "eq"
},
"max_score": 1,
"hits": [
{
"_index": "testindex",
"_type": "_doc",
"_id": "1234567890abcdefghijklmnopqrstuvwxyz0123",
"_score": 1,
"_source": {
"field1": "フィールド1",
"field2": "フィールド2",
~
実際に連携先のシステムとして欲しいデータは、 hits.hits._source.field1~ 以降になるのですが
このレスポンスからそのデータを取り出す際は、jsonの階層を掘っていって取得するしかないのでしょうか。
まだ検討を始めたばかりで、恐らくこういったシステム関連系のケースは
よくあるかと存じますが、みなさんどのように実現されていますでしょうか。
何かいい方法などありましたら、ご教示いただけますと幸いです。
どうぞよろしくお願いいたします。
tsgkdt
(tsgkdt)
September 21, 2019, 1:11pm
2
もちろん、レスポンスで返ってきたJSONを何とかするというのがシンプルかと思いますが、
連携先のシステムが何で、どういう連携をしたいのかによって、選べる手段も変わってくるかと思います。
今回は、それが明らかでないので、3つほど他のアプローチを紹介してみます。
Elasticsearch SQLを使う
詳細は上のページに書いてありますが、フォーマットをCSVやTSVに指定することができます。
json以外のデータ取得方法が欲しいという場合は、この方法も検討できるかと思います。
例えば、このような感じです。
POST forum0920/_doc/1
{
"field1": "hoge",
"field2": "bar",
"field3": "fuga"
}
POST _sql?format=tsv
{
"query": """
SELECT * FROM forum0920
"""
}
SELECTで取得する列名を具体的に書いてやれば、不要なフィールドも削ることができます。
POST _sql?format=tsv
{
"query": """
select
field1 as "フィールド1",
field2 as "フィールド2"
FROM forum0920
"""
}
LogstashのInputにElasticsearchを指定する
特定のインデックスに検索クエリを投げて、結果に対して何か(AWS S3に置く、ファイルに出力するなどなど)する場合には検討できるかもしれません。
外部のツールと連携させる
CDataと何か他のETLツールを組み合わせるアプローチもあるかもしれません。
(参考)
Hi Guys,
do you know any ETL tool where is possible to have a connector to ElasticSearch and get all data that i need?
I was trying talend studio (big data) and oracle data integrator, but without results.
if with this tools i cannot find a way to extract the data, Do you think that is better extract data and write it to a file and after use the ETL tool to load data from file?
thank you
ご参考になれば幸いです。
sshota
(shota)
September 26, 2019, 3:01am
3
ご回答ありがとうございます。
頂いた候補から下記を試しているのですが、追加で2点ご教示頂けませんでしょうか。
InputにElasticsearchを指定した場合、起動し処理が終了したらLogstashがshutdownします。
これは、Schedulerオプションが未指定であるため、" If no schedule is given, then the statement is run exactly once."の仕様に沿っている、という理解であっていますでしょうか。
またそうである場合、できるならば常駐して、指定indexが更新された場合、その差分のみを取得するようにしたいのですが、そういったことはできますでしょうか。
Outputにemailプラグインを指定することを試みています。
emailを送るということはできたのですが、Elasticsearch inputから取得したデータをJSON形式でメール本文に載せたいのですが、そのデータを取り出し方がわかりません。outputでどのように指定すればよいでしょうか。
本来の内容から一部外れている部分もありますが、
ご回答頂けますと幸いです。
tsgkdt
(tsgkdt)
September 30, 2019, 12:42pm
4
常駐して、指定された条件に合致したらメールを送信する という用途でしたらWatcherでEmail Actionを検討するのはどうでしょうか?
https://www.elastic.co/guide/en/elastic-stack-overview/current/watcher-getting-started.html
Logstashの場合、inputでスケジュールを指定して(たとえば5分間隔で実行するなど)、
クエリの中で、インデックス時間が今より5分前以上などとすれば、無理くりできなくもなさそうです。
"query": {
"range": {
"timestamp": {
"gte": "now-5m"
}
}
}
Email送信ですが、特定のフィールド(例えば %{message}など)を指定することになるため、
stdoutで出力されるようなjsonをメール本文にしたいというのは厳しそうです。
いずれにしましても、具体的に達成したい連携の目的や背景によって、選択できるものが変わってくるかと思います。
他にも良いやり方があるかもわかりませんが、今のところこれぐらいしか思いつきません。
system
(system)
Closed
October 28, 2019, 12:42pm
5
This topic was automatically closed 28 days after the last reply. New replies are no longer allowed.