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

Unity Catalogマネージドテーブルの全文検索インデックス

備考

ベータ版

この機能はベータ版です。ワークスペース管理者は、 プレビュー ページからこの機能へのアクセスを制御できます。Databricksのプレビューを管理するを参照してください。

全文検索インデックスを使用すると、管理対象のDelta LakeまたはIcebergテーブルの1つまたは複数のテキスト列に対する検索が高速化されます。このインデックスは、部分文字列照合と単語照合をサポートしています。searchまたはisearch関数を使用してテーブルをクエリすると、Databricks はインデックスを使用して、一致する行が含まれていないことが確実なファイルをスキップします。これにより、特に選択的な検索の場合、スキャンされるデータ量が大幅に削減されます。

重要

ベータ版リリース中に作成されたインデックスは、後のリリースとの互換性が保証されません。この機能がパブリックプレビュー段階に達したら、既存のインデックスを削除し、新しいインデックスを作成する必要があります。

要件

全文検索インデックスには、コンピュート、ベース テーブルとスキーマのアクセス許可、およびベース テーブルの構成に関する要件があります。

コンピュート

全文検索インデックスは、Databricks Runtime 18.2以降でのみ利用可能であり、ワークスペース設定でこのベータ版機能を有効にする必要があります。Databricksのプレビューを管理するを参照してください。

権限

検索インデックスを作成するには:

  • 検索インデックスで参照されているテーブルに対して、 MODIFY権限を持っている必要があります。
  • 親スキーマに対してCREATE TABLE権限が必要です。スキーマの所有者、またはMANAGE権限を持つユーザーは、あなたにスキーマに対するCREATE TABLE権限を付与できます。

テーブル構成

全文検索インデックスを作成する前に、ベーステーブルが以下のすべての条件を満たしている必要があります。

  • インデックスは、ベーステーブルと同じカタログおよびスキーマ内に作成する必要があります。
  • このテーブルは、管理対象のDelta Lakeテーブル、または管理対象のIcebergテーブルです。
  • 行追跡が有効になっています ( delta.enableRowTracking = true )。Databricks の行追跡を参照してください。
  • インデックス付き列は、 STRINGVARIANTSTRUCT 、またはARRAYのタイプです。STRING列はUTF8_BINARY照合順序を使用します。
  • STRUCT列には、任意のネスト深度に少なくとも1つのSTRINGVARIANT 、またはARRAYリーフフィールドが含まれています。その他のリーフフィールドは無視されます。
  • このテーブルは、 Delta Sharing 、シャロークローニング、属性ベースのアクセス制御、行レベルのセキュリティ、 および列マスクなど、制限事項のリストにある機能を使用していません。 制限事項を参照してください。

Delta LakeとIcebergテーブルの両方に適用されるテーブルプロトコルの要件については、 Delta Lake機能互換性とプロトコルを参照してください。

全文検索インデックスを作成する

1つのテーブルに対して、それぞれ異なる列に最大4つのインデックスを作成できます。

CREATE SEARCH INDEX使用すると、1 つ以上のテキスト列に対してインデックスを作成できます。次の例は、既存のログテーブルの2つのテキスト列にインデックスを作成する例です。

SQL
CREATE SEARCH INDEX log_idx
ON logs (message, error_detail);

完全な構文は次のとおりです。

SQL
CREATE SEARCH INDEX [IF NOT EXISTS] index_name
ON table_name ( column_name [, column_name ...] )
[OPTIONS ( option_key = option_value [, ... ] )]

index_name スキーマ内で一意である必要があり、既存のテーブル名と一致してはいけません。

テキストのトークン化方法を制御するには、 「オプション」を参照してください。

警告

CREATE SEARCH INDEXREFRESH INDEX実行途中で失敗した場合は、 REFRESH INDEXを実行して部分的な失敗から回復してください。

オプション

OPTIONS句は、以下のキーを受け入れます。

キー

デフォルト

説明

tokenizer

ngram, split

ngram

インデックス作成のためにテキストがどのようにトークン化されるか。ご使用の用途に合ったトークナイザーを選択してください。

ngram_size

整数 [3, 10]

5

生成されたn-グラムの長さ。tokenizer = 'ngram'の場合のみ有効です。

min_token_length

整数 >= 1

3

保持するトークンの最小長。これより短いトークンはインデックス作成時に削除されます。tokenizer = 'split'の場合のみ有効です。

無効なオプションエラーに関する詳細情報については、 SEARCH_INDEX_INVALID_PARAMETERS エラー条件を参照してください。

用途に合ったトークナイザーを選択してください

検索インデックスには、使用状況に応じて2つのトークナイザーオプションが用意されています。

トークナイザー

ユースケース

説明

ngram

部分文字列の照合。

テキストを長さngram_sizeの重複するnグラムに分割します。

split

単語全体包含チェック。

テキストを単語トークンに分割します。「勝手」は、Unicode 文字 ( \p{L} ) と結合マーク ( \p{M} ) の実行です。他の文字は区切り文字です。

n-gramサイズが4のn-gramインデックスを作成するには:

SQL
CREATE SEARCH INDEX log_ngram_idx
ON logs (message)
OPTIONS (tokenizer = 'ngram', ngram_size = 4);

最小トークン長が2のsplitインデックスを作成するには:

SQL
CREATE SEARCH INDEX log_word_idx
ON logs (message)
OPTIONS (tokenizer = 'split', min_token_length = 2);

searchを使用してデータをクエリし、 isearch

Databricksには、検索パターンが1つ以上のテキストターゲットに存在するかどうかをテストするための2つのSQL関数があります。

  • search: 大文字と小文字を区別。
  • isearch大文字と小文字は区別されません。

大文字小文字の区別に関する要件に基づいて、 searchまたはisearchを選択してください。インデックス付けされた列が全文検索インデックスでカバーされている場合、Databricks はそのインデックスを使用して、一致する行が含まれていないことが確実なファイルをスキップします。検索インデックスは検索結果に影響を与えません。

インデックスは、検索パターンがテーブルのファイルのごく一部にしか出現しない場合に、クエリの速度を最も向上させます。

SQL
search( target [, target ... ] , 'pattern' [, mode => 'substring' | 'word' ] )
isearch( target [, target ... ] , 'pattern' [, mode => 'substring' | 'word' ] )

引数

search およびisearch 、以下の引数を受け入れます。

  • target 型はSTRINGVARIANTSTRUCT 、またはARRAYでなければなりません。これらはインデックス付けで許可されている型と同じです。ターゲットは重複排除されます。
  • pattern null以外の文字列リテラルである必要があります。
  • mode patterntargetにどのように一致するかを指定します。
    • substring (デフォルト): patternは各target内の部分文字列として一致します。
    • word: patternsplitトークナイザーと同じルールを使用して単語トークンに分割されます。この関数は、 pattern内のすべての単語が、順序に関係なく、少なくとも 1 つのターゲットに含まれている場合に true を返します。ご使用の用途に合ったトークナイザーを選択してください。

戻り値

search そして、 isearch 3値ロジックでBOOLEAN値を返します。

  • true 少なくとも1つのnull以外のターゲットが一致する場合。
  • null 非ヌルターゲットが一致しないが、少なくとも1つのターゲットがnullである場合。
  • false すべてのターゲットがnullではなく、かつ一致するターゲットがない場合。

以下の例は、一般的なsearchおよびisearchクエリを示しています。

SQL
-- Case-insensitive substring search across one column.
SELECT * FROM logs
WHERE isearch(message, 'connection refused');

-- Case-sensitive substring search across multiple columns.
SELECT * FROM logs
WHERE search(message, error_detail, '550e8400-e29b-41d4-a716-446655440000');

-- Word search: matches rows containing all three words, in any order.
SELECT * FROM audit_logs
WHERE search(message, 'user admin login', mode => 'word');

インデックスの管理

重要

全文検索インデックスは、基本テーブルが変更されても自動的に更新されません。インデックスの更新を参照してください。

Databricksは、インデックスの鮮度に関係なく、クエリの正確性を維持します。テーブルにインデックスのないデータが含まれている場合、クエリは既存のインデックスを使用してインデックス付きレコードへのアクセスを高速化し、インデックスのないレコードについてはテーブルスキャンを使用します。

全文検索インデックスを管理するには、以下の操作を使用します。

索引の説明または表示

インデックスに関する情報を表示するには:

SQL
DESCRIBE INDEX log_idx;

インデックスを更新する

全文検索インデックスは、基本テーブルが変更されても自動的に更新されません。

インデックスを更新するには、新しい行のエントリを追加します。

SQL
REFRESH INDEX log_idx;

REFRESH INDEX これは、増分的な追記専用操作です。新しいデータはインデックス化されますが、削除された行のエントリは削除されません。

インデックスを更新するには、新しい行のエントリを追加し、削除された行のエントリを削除するために、 REFRESH INDEX ... FULL使用します。

SQL
REFRESH INDEX log_idx FULL;

完全な更新には、増分更新よりも多くのコンピュート リソースが必要です。 時間の経過とともに、増分更新によって古いエントリが蓄積され、インデックスのサイズが大きくなり、パフォーマンスに悪影響を及ぼします。

インデックスを削除する

インデックスを削除するには、次のコマンドを実行します。

SQL
DROP INDEX log_idx;

インデックスが見つからない場合のエラーを回避するには、以下を使用してください。

SQL
DROP INDEX IF EXISTS log_idx;
注記

ベーステーブルを削除すると、このコマンドは全文検索インデックスも削除します。

制限事項

全文検索インデックスには、以下の制限があります。

  • ベーステーブルのインデックス付き列の名前変更、またはデータ型の変更はサポートされていません。
  • Delta Sharingを持つテーブルはサポートされていません。 インデックス作成後にベーステーブルをDelta Sharingまたはターゲットとして追加すると、 Databricks検索インデックスを無視します。
  • 浅いクローンを持つテーブルはサポートされていません。インデックスの作成後にベース テーブルをシャローク ローン ソースとして追加すると、 Databricks検索インデックスを無視します。
  • 属性ベースのアクセス制御、列マスク、または行レベルのセキュリティポリシーを持つテーブルはサポートされていません。検索インデックスを持つテーブルにこれらのコントロールを追加すると、Databricks は検索インデックスを無視します。属性ベースアクセス制御(ABAC)の基本概念を参照してください。