メインコンテンツへスキップ

ClickStack と Elastic での検索

ClickHouse は SQL ネイティブの engine であり、高性能な分析ワークロード向けにゼロから設計されています。一方、Elasticsearch は SQL ライクなインターフェイスを提供し、SQL を基盤となる Elasticsearch の query DSL に変換します。つまり、SQL は第一級の機能ではなく、機能面での互換性 も限定的です。 ClickHouse は完全な SQL をサポートするだけでなく、argMaxhistogramquantileTiming のようなオブザーバビリティ向けのさまざまな関数も備えており、構造化されたログ、メトリクス、トレースに対するクエリを簡潔に記述できます。 シンプルなログやトレースの調査には、ClickStack UI (HyperDX) が、フィールドと値によるクエリ、範囲指定、ワイルドカードなどに対応した、直感的なテキストベースの絞り込みを行える Lucene スタイルの構文 を提供します。これは、Elasticsearch の Lucene 構文 や、Kibana Query Language の一部に相当します。 この検索インターフェイスは、こうした馴染みのある構文をサポートしつつ、内部ではそれを効率的な SQL の WHERE 句に変換します。そのため、Kibana ユーザーにも親しみやすく、必要に応じて SQL の強力な機能も活用できます。これにより、ClickHouse の 文字列検索関数類似度関数日時関数 を幅広く活用できます。 以下では、ClickStack と Elasticsearch の Lucene クエリ言語を比較します。

ClickStack 検索構文と Elasticsearch query string の比較

ClickStack と Elasticsearch はどちらも、ログや トレース を直感的にフィルタリングできる柔軟なクエリ言語を提供しています。Elasticsearch の query string は DSL と索引エンジンに密接に統合されている一方、ClickStack は内部的に ClickHouse SQL に変換される、Lucene に着想を得た構文をサポートしています。以下の表では、一般的な検索パターンが両システムでどのように動作するかを示し、構文上の共通点とバックエンドでの実行方法の違いをまとめています。

Exists/missing の違い

イベント内でフィールド自体を完全に省略でき、その結果として本当に「存在しない」状態になり得る Elasticsearch とは異なり、ClickHouse ではテーブルのスキーマに定義されたすべてのカラムが必ず存在します。insert イベントでフィールドが指定されていない場合は、次のようになります。
  • Nullable フィールドでは、NULL が設定されます。
  • 非 Nullable フィールド (デフォルト) では、デフォルト値 (多くの場合は空文字列、0、またはそれに相当する値) が設定されます。
ClickStack では、Nullable推奨されていないため、後者を使用します。 この挙動により、Elasticsearch の意味でフィールドが「存在する」かどうかを確認することは、直接的にはサポートされていません。 代わりに、空でない値があるかどうかは、field:* または field != '' を使って確認できます。そのため、実際に欠落しているフィールドと、明示的に空のフィールドを区別することはできません。 実運用では、この違いがオブザーバビリティのユースケースで問題になることはほとんどありませんが、システム間でクエリを移行する際には、この点を意識しておくことが重要です。
最終更新日 2026年7月2日