Splunkコマンドの「search」と「where」はどちらを使えばよいのか迷うことが多いので、違いについて整理します。
サンプルデータ
| makeresults | eval "A field" = "abcdefg" ,"B field" = "abcdefg","C field" = 1000 | append [makeresults | eval "A field" = "hijklmn","B field" = "abcdefg","C field" = "opqrst"] | fields - _time

このデータを使って確認していきます。
「search」と「where」の違い
フィールドの比較ができる(where)
whereの場合、フィールドの比較が可能です。
コード
| makeresults | eval "A field" = "abcdefg" ,"B field" = "abcdefg","C field" = 1000 | append [makeresults | eval "A field" = "hijklmn","B field" = "abcdefg","C field" = "opqrst"] | fields - _time | where 'A field' = 'B field'
結果

「A field」と「B field」が一致する行だけ抽出されました。
“(ダブルクォーテーション)でフィールド名を囲うと文字列と認識してしまうので、値を比較するために’(シングルクォーテーション)で囲います。
サンプルデータはフィールド名に空白が含まれているため、’(シングルクォーテーション)で囲いましたが、「A_field」のように空白を含まない場合は、’(シングルクォーテーション)で囲う必要はありません。
searchの場合は、フィールド同士の比較はできません。
*(ワイルドカード)が使える(search)
searchの場合、*(アスタリスク)をワイルドカードとして使用できます。
コード
| makeresults | eval "A field" = "abcdefg" ,"B field" = "abcdefg","C field" = 1000 | append [makeresults | eval "A field" = "hijklmn","B field" = "abcdefg","C field" = "opqrst"] | fields - _time | search "A field" = "*jk*"
結果

「A field」に「jk」を含む行が抽出されました。
whereでもlike関数を使用すれば同じことができますが、searchのほうがお手軽に感じます。
関数が使える(where)
whereはisnum(),isnull(),like()などの関数が使えます。
コード
| makeresults | eval "A field" = "abcdefg" ,"B field" = "abcdefg","C field" = 1000 | append [makeresults | eval "A field" = "hijklmn","B field" = "abcdefg","C field" = "opqrst"] | fields - _time | where isnum('C field')
結果

「C field」が数値の行のみ抽出されました。
コード
| makeresults | eval "A field" = "abcdefg" ,"B field" = "abcdefg","C field" = 1000 | append [makeresults | eval "A field" = "hijklmn","B field" = "abcdefg","C field" = "opqrst"] | fields - _time | where like('A field',"%jk%")
結果

「A field」に「jk」を含む行が抽出されました。
使える関数はこちらに記載されています。
結構色々使えますね。
whereで使える関数


まとめ
whereの方が、フィールド同士を比較できたり、関数を使えるので細かい抽出が可能です。
searchは、最初のコマンド(search)で抽出することができるので、お手軽に使えます。
コマンド自体のパフォーマンスの違いはわかりませんが、データの抽出はできるだけ初期に実施したほうが全体のパフォーマンスは向上するので、私はsearchで抽出できる場合はできるだけsearchで抽出し、searchで出来ない場合のみwhereで実施するようにしています。