フィルタリングの指定方法について

Kibanaで多少複雑な条件に合致したドキュメントをフィルタリングしたいです。
例えば、下記内容において、フィールドA(ID)とB(色)に着目して、
Bに「Red」が含まれている場合、そのA(ID)のドキュメントを全てフィルタリングしたいです。
下例の場合、対象となるドキュメント_idは1,2,3,6,7,8,9,10,12,13となる。
ダッシュボード全体、もしくはビジュアリゼーション単体で上記フィルタリングを実現するにはどうすればいいでしょうか?

_id A B
1 1 Red
2 1 Blue
3 1 Yellow
4 2 Broun
5 2 White
6 3 Yellow
7 3 Red
8 3 White
9 3 Black
10 3 Gray
11 4 Black
12 5 Yellow
13 5 Red
14 6 Blue
15 6 Black

説明不足でわかりにくかもしれませんが、よろしくご教示お願いいたします。

2段階の検索が必要ということですね。
B=Redで検索 ⇒ A=1,3,5
A=1,3,5で検索 ⇒ id = 1,2,3,6,7,8,9,10,12,13

ElasticsearchにはSQLのようなサブクエリは無いので、やや段階を踏んだ実装が必要なように思います。他にやり方はあるかもしれませんが、以下の方法が思いつきます。

  1. 何らかの方法で、以下のようなドキュメントを持つインデックス(test_terms_lookup)を作成する。
{
  "_id": "Red",
  "_source": {
    "A": ["1", "3", "5"]
  }
}
  1. KibanaのDashboardやDiscoverの+Add filterにて"Edit as Query DSL"をクリックし、以下のTerms lookup クエリを入力。
{
  "query": {
    "terms": {
      "A": {
        "index": "test_terms_lookup",
        "id": "Red",
        "path": "A"
      }
    }
  }
}

これで、"Red"から目的のドキュメントを検索できるようになりました。1.の「何らかの方法」については、継続的な更新が必要であれば、pivot transformとscripted metric aggregationを駆使すると自動化もできるかもしれません。

また、要件次第では、

{"A": 1, "B": ["Red", "Blue", "Yellow"]}

と言った形でドキュメントを持つことも検討されるかと思います。

1 Like

ありがとうございます。とても参考になります。
ネスト構造が必要だとばかり思っていましたが、2段階ステップを踏む必要があるのですね。
ステップ1は自動化したいところなので調べてみます。

ご指摘の通り、ネスト構造を持ったドキュメントとすることでも同様の検索が可能と思います。

1 Like