Log Analyticsの検索などで利用される、Kustoの、containsとhasの違いについて記載します。
クエリするときに、何度か勘違いしていたので、詳細を記載しておこうと思います。
少し語弊があるかもしれませんが、端的に以下のように言えます。
contaisは任意の文字列単位で検索し、
hasは単語単位で検索し
ます。検索したい対象が、単語やフレーズの完全一致である場合はhasを使ってください。
contaisnとhasのそれぞれのマニュアルは以下です。
大文字と小文字を区別しない文字列を含む、データのレコード セットをフィルター処理します。
contains は、 terms ではなく任意のサブ文字列を検索します。
大文字と小文字を区別しない文字列を使用して、データのレコード セットをフィルター処理します。
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を指定しないと用途を満たさない場合もあると思いますのでご注意ください。