Omni の always_where_filters と default_filters を試してみた

Omni の always_where_filters と default_filters を試してみた

2026.06.04

こんにちは、ikumiです。

Omni のトピックには「このトピックを使うときは常にこの条件で絞り込んでほしい」「最初からこのフィルターをかけた状態にしておきたい」というニーズに対応するパラメーターが2つあります。

  • always_where_filters — すべてのクエリに強制適用。ユーザーが外せない
  • default_filters — デフォルトで適用。ユーザーが変更・解除できる

今回はこの2つの設定方法と挙動の違いを試してみました。

https://docs.omni.co/modeling/topics/parameters/always-where-filters
https://docs.omni.co/modeling/topics/parameters/default-filters

機能概要

2つのパラメーターの主な違いは以下の通りです。

always_where_filters default_filters
ユーザーによる変更 不可(SQL レベルで強制適用) 可能(ワークブックのフィルター欄から変更・解除できる)
クエリ上での表示 フィルター欄には表示されない(SQL にのみ反映) フィルター欄に表示される
既存クエリへの適用 適用される 適用されない(新規クエリのみ)
主な用途 削除済みレコードやテストデータの除外など、必ず除外したい条件 直近期間や特定ステータスなど、出発点として推奨する絞り込み

試してみた

事前準備

brand_ana__tran トピックのファイルを編集します。

1. always_where_filters を設定する

テストデータとして登録されているブランド(TEST)を、このトピックのすべてのクエリから常に除外するフィルターを設定します。

brand_ana__tran.topic.yamlalways_where_filters を追加します。

always_where_filters:
  brand_ana__tran.brand_name:
    not: test

view_name.field_name の形式でフィールドを指定し、フィルター演算子と値を記述します。
変更を保存し、ワークブックでbrand_ana__tranトピックを開きます。フィルター欄には何も表示されていないですが、SQL レベルで常にフィルターが適用され、テストデータとして登録されているブランドが除外されています。

▼設定前
omni-always-where-filters-n-default-filters-no1

▼設定後
omni-always-where-filters-n-default-filters-no3
omni-always-where-filters-n-default-filters-no2

2. default_filters を設定する

トピックを開いたとき、最初から直近 90 日間の注文日(order_date)が絞り込まれた状態にしておく default_filters を追加します。

期間でフィルタリングする際の構文が少し難しいですが、こちらのドキュメントを参考にして作成しました。

default_filters:
  brand_ana__tran.order_date:
    time_for_duration: [ 90 days ago, 90 days ]

変更を保存し、brand_ana__tran トピックで新しいクエリを開きます。フィルター欄に order_date の過去 90 日間フィルターが最初から設定されていれば問題ありません。

omni-always-where-filters-n-default-filters-no4

always_where_filters と異なり、フィルター欄に表示されているためユーザーが条件を変更できるのと、default_filters の場合はフィルター自体をユーザーが削除することも可能です。

omni-always-where-filters-n-default-filters-no5

3. always_where_sql × テンプレートフィルターで「表示されるが外せない」フィルターを実現する

Looker には always_filter(フィルター欄には表示されていて値は変更できるが、フィルター自体は削除できない)という機能がありますが、Omni にはこれに相当するパラメーターがありません。そのため、今回はalways_where_sql × テンプレートフィルター × default_filters を組み合わせることで、近い挙動を実現できます。

① ビューファイルにフィルター専用フィールドを定義する

filters:
  date_filter:
    type: timestamp
    default_filter:
      time_for_duration: [ 3 years ago, 3 years ]

default_filter でフィールドの初期値を設定します。ユーザーが値を指定していない状態でも、この値が SQL に渡されます。

② トピックファイルで always_where_sql にテンプレートフィルターを埋め込む

always_where_filters がフィルター構文(YAML)を受け取るのに対し、always_where_sql は生の SQL を記述するパラメーターです。SQL 内に Mustache 構文が書けるため、テンプレートフィルターと組み合わせることができます。

always_where_sql: |
  {{# brand_ana__tran.date_filter.filter }}
    order_date
  {{/ brand_ana__tran.date_filter.filter }}
  {{^ brand_ana__tran.date_filter.filter }}
    order_date >= DATEADD(year, -3, CURRENT_DATE())
  {{/ brand_ana__tran.date_filter.filter }}

{{# }} ブロックはフィルター値が設定されているときに発動し、{{^ }} ブロックはフィルター値がないときのフォールバックとして機能します。always_where_sql に書いているため、どちらの場合も SQL 条件は必ず適用されます。

default_filters でフィルター欄に常に表示する

default_filters:
  brand_ana__tran.date_filter:
    time_for_duration: [ 3 years ago, 3 years ]

default_filters にフィルター専用フィールドを指定することで、クエリを開いたときからフィルター欄に表示された状態になります。

omni-always-where-filters-n-default-filters-no6

また、ユーザーが値を変更するとその値が SQL に反映されます。

omni-always-where-filters-n-default-filters-no7

仮にユーザーがフィルターを削除しても {{^ }} のフォールバック条件が発動するため、SQL レベルでの絞り込みは常に維持されます。

omni-always-where-filters-n-default-filters-no8

ただし、この際 always_where_filters と同様に、フィルターが適用されていることがユーザーには通知されないため、注意が必要です。

最後に

Omni の always_where_filtersdefault_filters を試してみました。

「外せないフィルター」が必要なら always_where_filters、「出発点として推奨するが変更は自由」という場合は default_filters と使い分けるのがポイントです。テストデータや削除済みレコードの除外には always_where_filters が、直近期間やデフォルトのステータス絞り込みには default_filters が向いていますので、適切な方を使用していただければと思います。

この記事をシェアする

関連記事