メインコンテンツまでスキップ
メインコンテンツまでスキップ

ClickStack と Elastic での検索

ClickStack と Elastic における検索

ClickHouse は、高性能の分析ワークロード用にゼロから設計された SQL ネイティブエンジンです。対照的に、Elasticsearch は SQL に似たインターフェースを提供し、SQL を基盤となる Elasticsearch クエリ DSL にトランスパイルします。つまり、これは一級市民ではなく、機能の対等性が制限されています。

ClickHouse は完全な SQL をサポートするだけでなく、argMaxhistogram、およびquantileTimingなどの可観測性向けの関数を豊富に拡張し、構造化されたログ、メトリクス、およびトレースのクエリを簡素化します。

簡単なログおよびトレースの探索には、HyperDX が提供するLuceneスタイルの構文を使用して、フィールドと値のクエリ、範囲、ワイルドカードなどに対する直感的でテキストベースのフィルタリングが可能です。これは、Elasticsearch におけるLucene 構文およびKibana クエリ言語の要素に相当します。

Search

HyperDX の検索インターフェースは、この使い慣れた構文をサポートしていますが、その背後では効率的な SQL WHERE 句に変換されているため、Kibana のユーザーには馴染みのある体験を提供しつつ、必要に応じて SQL のパワーを活用することも可能です。これにより、ユーザーは ClickHouse における文字列検索関数類似性関数、および日時関数の全範囲を活用できます。

SQL

以下に、ClickStack と Elasticsearch の Lucene クエリ言語を比較します。

ClickStack の検索構文と Elasticsearch のクエリ文字列の比較

HyperDX と Elasticsearch の両方が、直感的なログとトレースのフィルタリングを可能にする柔軟なクエリ言語を提供します。Elasticsearch のクエリ文字列はその DSL やインデクシングエンジンと緊密に統合されていますが、HyperDX は ClickHouse SQL に変換される Lucene 風の構文をサポートしています。以下の表は、両システムにおける一般的な検索パターンの挙動を示し、構文の類似性とバックエンドでの実行の違いを強調しています。

機能HyperDX 構文Elasticsearch 構文コメント
フリーテキスト検索errorerrorすべてのインデックスされたフィールドに一致;ClickStack ではこれがマルチフィールド SQL ILIKE に書き換えられる。
フィールドマッチlevel:errorlevel:error同一の構文。HyperDX は ClickHouse における正確なフィールド値をマッチングします。
フレーズ検索"disk full""disk full"引用されたテキストは正確なシーケンスに一致;ClickHouse は文字列の等価性または ILIKE を使用。
フィールドフレーズマッチmessage:"disk full"message:"disk full"SQL ILIKE または正確なマッチに変換される。
OR 条件error OR warningerror OR warning用語の論理 OR;両システムはこれをネイティブにサポート。
AND 条件error AND dberror AND db双方が交差に変換;ユーザー構文に差はない。
否定NOT error または -errorNOT error または -error同様にサポート;HyperDX は SQL NOT ILIKE に変換。
グルーピング(error OR fail) AND db(error OR fail) AND db両者で標準のブールグルーピング。
ワイルドカードerror* または *fail*error*, *fail*HyperDX は先頭および末尾のワイルドカードをサポート;ES はパフォーマンスのため先頭のワイルドカードをデフォルトで無効にします。用語内のワイルドカードはサポートされません。例:f*ail. ワイルドカードはフィールドマッチと共に適用する必要があります。
範囲 (数値/日付)duration:[100 TO 200]duration:[100 TO 200]HyperDX は SQL BETWEEN を使用;Elasticsearch は範囲クエリに展開。無制限の * は範囲においてサポートされていません。例:duration:[100 TO *] は無効です。必要に応じて以下の 無制限の範囲 を使用してください。
無制限の範囲 (数値/日付)duration:>10または duration:>=10duration:>10または duration:>=10HyperDX は標準の SQL 演算子を使用します。
包含/除外duration:{100 TO 200} (除外)同様波括弧は除外の境界を示します。範囲内での * はサポートされていません。例:duration:[100 TO *]
存在確認N/A_exists_:user または field:*_exists_ はサポートされていません。LogAttributes.log.file.path: *Map カラムに使用してください。例:LogAttributes。ルートカラムの場合は、これらは存在しなければならず、イベントに含まれていない場合にはデフォルト値を持ちます。デフォルト値または欠落しているカラムを検索する場合は、Elasticsearch と同様の構文を使用します。例:ServiceName:* または ServiceName != ''
正規表現match 関数name:/joh?n(ath[oa]n)/現在 Lucene 構文ではサポートされていません。ユーザーは SQL および match 関数や他の文字列検索関数を使用できます。
フォズィーマッチeditDistance('quikc', field) = 1quikc~現在 Lucene 構文ではサポートされていません。距離関数は SQL で使用できます。例:editDistance('rror', SeverityText) = 1 または 他の類似性関数
近接検索サポートされていない"fox quick"~5現在 Lucene 構文ではサポートされていません。
ブースティングquick^2 foxquick^2 fox現在 HyperDX ではサポートされていません。
フィールドワイルドカードservice.*:errorservice.*:error現在 HyperDX ではサポートされていません。
特殊文字のエスケープ予約された文字を \ でエスケープ同様予約されたシンボルにはエスケープが必要です。

存在/欠如の違い

フィールドがイベントから完全に省略される可能性のある Elasticsearch に対して、ClickHouse ではテーブルスキーマ内のすべてのカラムが存在する必要があります。挿入イベントでフィールドが提供されていない場合:

  • Nullable フィールドの場合、それは NULL に設定されます。
  • 非 Nullable フィールドの場合(デフォルト)、デフォルト値(しばしば空文字列、0、または同等の値)で埋められます。

ClickStack では、後者を使用します。Nullable推奨されていません

この動作により、Elasticsearch の意味でフィールドが「存在するか」を確認することは直接的にサポートされません。

代わりに、ユーザーは field:* または field != '' を使用して非空の値の存在を確認することができます。したがって、真に欠落しているフィールドと明示的に空のフィールドを区別することはできません。

実際には、この違いが可観測性のユースケースで問題になることはほとんどありませんが、システム間でクエリを変換する際には留意しておくことが重要です。