1
Help us understand the problem. What are the problem?

More than 1 year has passed since last update.

posted at

updated at

Organization

RedashでデータソースにElasticsearchを使用した時の問題

RedashのデータソースとしてElasticsearchが使えるようなので、試してみた所、色々と問題がある事が分かった。

環境

Redash(v7.0.0)
Elasticsearch(v7.3.2)

問題

Elasticsearchからのクエリ結果を正しく(期待する)表形式にできない。

RedashからQueryを実行すると、下記のようにQueryRunnerを介してクエリの発行及び、結果表示が行われている。

画面からQuery実行 → QueryRunner → Elasticsearch → QueryRunner → 画面に結果を表形式で表示

Elasticsearchからのクエリ結果は期待通りになっている事を確認できたので、今回の問題は、Elasticsearchからのクエリ結果をQueryRunnerで表形式にパースできていないとこにある事が分かった。

複数Aggregationのクエリを実行した際の結果

下記のようなAggregationを入れ子にしたクエリを実行。

{
    "index": "インデックス名",
    "size": 1000,
    "aggs": {
        "1st": {
            "terms": {
                "field": "LogDate"
            },
            "aggs": {
                "2nd": {
                    "terms": {
                        "field": "SectionName"
                    }
                }
            }
        }
    }
}

イメージ的には、日付、部署で集計するので、下記のような結果を期待。

LogDate SectionName
2019年10月29日 システム部 10
2019年10月29日 人事部 20
2019年10月29日 総務部 30
2019年10月30日 システム部 100
2019年10月30日 人事部 200
2019年10月30日 総務部 300

しかし、RedashでTableの結果として表示されるのは、下記のようになる。
→もはや、何で集計されていて、何の数か分からない。

2nd doc_count
(SectionNameの何かしらの値) 110
(SectionNameの何かしらの値) 220
(SectionNameの何かしらの値) 330

JSONの構造が複雑になるケース

例えば、Sum Bucket Aggregationを使用した場合、Elasticsearchからのクエリ結果は下記のように、バケットのルートと同じ階層に別バケットが存在する。

{
    ・
    ・
    ・
   "aggregations": {
      "バケット名": {
         "buckets": [
            {
               バケット結果
            }
         ]
      },
      "SUM BUCKET名": {
          "value": 1000.0
      }
   }
}

結果は、"バケット名"の方だけ表形式で表示される
※"バケット名"の方だけ表形式で表示されるが、Aggregationが入れ子の場合には、前述の問題が発生
※"SUM BUCKET名"の方は捨てられる

対応方法

これらの問題を解決するには、
 ・Redashの既存ソースを修正するか、拡張プログラムを追加して、プログラム対応を行う
  拡張プログラムの対応は、「RedashのQueryRunnerを拡張する」を参考にして頂ければ
 ・ISSUEを起票してアップデート待ち(もしくは、自分で動く)

まとめ

多分、Elasticsearchをデータソースとする場合、Kibanaを選択する事が多いのか、発生した問題の挙動(クエリパターンとして、絶対あたるであろう)からしてほとんど使われてないのかな。

「データソースをElasticsearchにするなら、Redashは使わない」
「Redashを使うなら、データソースをElasticsearchにしない、もしする場合にはシンプルなクエリのみ」

のようにして、実現させた方が効率的だと感じました。

余談

データソースにKibanaにしたら結果が変わるかなと思いやってみましたが、Kibana用のクエリの記述で処理されるだけなので、同様の結果になりました。

データソースがKibanaではなく、あくまでクエリがKibana用で記述できるだけの挙動でした。

※こうではないので、注意が必要
 Kibanaを通した結果を得られるわけではない

画面からQuery実行 → QueryRunner → Kibana(Elasticsearch) → QueryRunner → 画面に結果を表形式で表示

Register as a new user and use Qiita more conveniently

  1. You can follow users and tags
  2. you can stock useful information
  3. You can make editorial suggestions for articles
What you can do with signing up
1
Help us understand the problem. What are the problem?