SearchAPIにおけるレスポンスデータの操作について

お世話になります。

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の階層を掘っていって取得するしかないのでしょうか。

まだ検討を始めたばかりで、恐らくこういったシステム関連系のケースは
よくあるかと存じますが、みなさんどのように実現されていますでしょうか。
何かいい方法などありましたら、ご教示いただけますと幸いです。

どうぞよろしくお願いいたします。

もちろん、レスポンスで返ってきたJSONを何とかするというのがシンプルかと思いますが、
連携先のシステムが何で、どういう連携をしたいのかによって、選べる手段も変わってくるかと思います。
今回は、それが明らかでないので、3つほど他のアプローチを紹介してみます。

  1. 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
  """
}
  1. LogstashのInputにElasticsearchを指定する

特定のインデックスに検索クエリを投げて、結果に対して何か(AWS S3に置く、ファイルに出力するなどなど)する場合には検討できるかもしれません。

  1. 外部のツールと連携させる

CDataと何か他のETLツールを組み合わせるアプローチもあるかもしれません。


(参考)

ご参考になれば幸いです。

ご回答ありがとうございます。
頂いた候補から下記を試しているのですが、追加で2点ご教示頂けませんでしょうか。

  1. InputにElasticsearchを指定した場合、起動し処理が終了したらLogstashがshutdownします。
    これは、Schedulerオプションが未指定であるため、" If no schedule is given, then the statement is run exactly once."の仕様に沿っている、という理解であっていますでしょうか。
    またそうである場合、できるならば常駐して、指定indexが更新された場合、その差分のみを取得するようにしたいのですが、そういったことはできますでしょうか。

  2. Outputにemailプラグインを指定することを試みています。
    emailを送るということはできたのですが、Elasticsearch inputから取得したデータをJSON形式でメール本文に載せたいのですが、そのデータを取り出し方がわかりません。outputでどのように指定すればよいでしょうか。

本来の内容から一部外れている部分もありますが、
ご回答頂けますと幸いです。

常駐して、指定された条件に合致したらメールを送信する という用途でしたら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をメール本文にしたいというのは厳しそうです。

いずれにしましても、具体的に達成したい連携の目的や背景によって、選択できるものが変わってくるかと思います。
他にも良いやり方があるかもわかりませんが、今のところこれぐらいしか思いつきません。

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