Kusto Query Language (KQL)におけるcontainsとhasの違い

Log Analyticsの検索などで利用される、Kustoの、containsとhasの違いについて記載します。

クエリするときに、何度か勘違いしていたので、詳細を記載しておこうと思います。

少し語弊があるかもしれませんが、端的に以下のように言えます。

contaisは任意の文字列単位で検索し、

hasは単語単位で検索し

ます。検索したい対象が、単語やフレーズの完全一致である場合はhasを使ってください。

contaisnとhasのそれぞれのマニュアルは以下です。

contains 演算子

大文字と小文字を区別しない文字列を含む、データのレコード セットをフィルター処理します。
contains は、 terms ではなく任意のサブ文字列を検索します。

has 演算子

大文字と小文字を区別しない文字列を使用して、データのレコード セットをフィルター処理します。
has は、インデックス付き用語を検索します。

hasは用語(単語)単位での検索で、インデックス検索です。インデックスに無いものは検索でヒットしません。

 

例で示します。なお、クエリはマイクロソフト社から提供されている無料デモ環境
https://aka.ms/LADemo
にて行っています。

クエリ文で以下のような検索結果が得られています。
AppTraces
| summarize by AppRoleName

ここから、以下のように絞り込みをします。
AppTraces
| summarize by AppRoleName
| where AppRoleName contains “Fabri” 

とした場合、検索結果は以下となります。

しかし、
AppTraces
| summarize by AppRoleName
| where AppRoleName has “Fabri” 

とした場合、検索結果がヒットしません。

これを、
AppTraces
| summarize by AppRoleName
| where AppRoleName has “Fabrikam” 

とした場合、検索結果がヒットします。(contains “Fabri” と同様となる)

このように、

hasは単語単位でインデックスを検索し、

containsは指定された文字列をそのまま全文検索します。上記の例だと、
Fabrikam  とした場合は単語単位の検索なので、hasでヒットしますが、
Fabri         とした場合は単語ではないので、containsでないとヒットしません。

マニュアルにもあるとおり、hasの方がインデックスを利用する為、高速ですし、推奨されています。
出来る限り、hasが利用できないか確認するべきでしょう。

しかし、検索したい内容によっては、containsを指定しないと用途を満たさない場合もあると思いますのでご注意ください。

いいね (←参考になった場合はハートマークを押して評価お願いします)
読み込み中...

注意事項・免責事項

※技術情報につきましては投稿日時点の情報となります。投稿日以降に仕様等が変更されていることがありますのでご了承ください。

※公式な技術情報の紹介の他、当社による検証結果および経験に基づく独自の見解が含まれている場合がございます。

※これらの技術情報によって被ったいかなる損害についても、当社は一切責任を負わないものといたします。十分な確認・検証の上、ご活用お願いたします。

※当サイトはマイクロソフト社によるサポートページではございません。パーソルクロステクノロジー株式会社が運営しているサイトのため、マイクロソフト社によるサポートを希望される方は適切な問い合わせ先にご確認ください。
 【重要】マイクロソフト社のサポートをお求めの方は、問い合わせ窓口をご確認ください