このトピックでは、検索インデックスの管理方法について説明します。
前提条件
検索インデックスを有効にしました。
説明検索インデックス機能は LindormSearch および Lindorm Tunnel Service (LTS) に依存します。この機能を有効化するには、LindormSearch および LTS も併せて有効化する必要があります。
制限事項
検索インデックスには使用制限があります。本番ワークロードへの影響を回避するため、利用前に制限事項をご確認ください。
データの準備
検索インデックスを利用する前に、テーブルを作成し、テストデータを書き込みます。
次の文を実行して、
search_tableという名前のテーブルを作成します。CREATE DATABASE searchindex_db; USE searchindex_db; CREATE TABLE IF NOT EXISTS search_table (user_id BIGINT, name VARCHAR, age SMALLINT, gender VARCHAR, address VARCHAR, email VARCHAR, city VARCHAR, PRIMARY KEY (user_id));次の文を実行して、テーブルに 4 行のデータを書き込みます。
UPSERT INTO search_table (user_id,name,age,gender,address,email,city) VALUES (1, 'Zhang', 18, 'M', 'Chaoyang District, Beijing', 'a***@example.net', 'Beijing'); UPSERT INTO search_table (user_id,name,age,gender,address,email,city) VALUES (6, 'Li', 32, 'M', 'Yuhang District, Hangzhou', 'a***@example.net', 'Hangzhou'); UPSERT INTO search_table (user_id,name,age,gender,address,email,city) VALUES (20, 'Wang', 28, 'M', 'Binjiang District, Hangzhou', 'a***@example.net', 'Hangzhou'); UPSERT INTO search_table (user_id,name,age,gender,address,email,city) VALUES (28, 'Chen', 36, 'F', 'Nanshan District, Shenzhen', 'a***@example.net', 'Shenzhen');次の文を実行して、テーブル内のデータを照会します。
SELECT * FROM search_table LIMIT 10;次の結果が返されます:
+---------+--------+-----+--------+--------------+------------------+------+ | user_id | name | age | gender | address | email | city | +---------+--------+-----+--------+--------------+------------------+------+ | 1 | Zhang | 18 | M | Chaoyang District, Beijing | a***@example.net | Beijing | | 6 | Li | 32 | M | Yuhang District, Hangzhou | a***@example.net | Hangzhou | | 20 | Wang | 28 | M | Binjiang District, Hangzhou | a***@example.net | Hangzhou | | 28 | Chen | 36 | F | Nanshan District, Shenzhen | a***@example.net | Shenzhen | +---------+--------+-----+--------+--------------+------------------+------+
検索インデックスの管理
テストデータに基づき検索インデックスを作成し、以下の要件を満たします:
テーブル内の任意のカラムを高速に検索可能にする。
addressカラムに対してトークン化クエリを実行可能にする。emailカラムに対してあいまいクエリを実行可能にする。
検索インデックスの作成 を実行します。
CREATE INDEX IF NOT EXISTS idx USING SEARCH ON search_table ( name, age, gender, address(type=text, analyzer=ik), email, city ) WITH (numShards=4);説明この例では、numShards を
4に設定しています。これは、インデックスidxが4個のシャードを持つことを意味します。もし numShards を明示的に指定しない場合、そのデフォルト値は LindormSearch ノード数の 2 倍となります。本番環境向けの検索インデックスを作成する際は、事前にシャード数を計画してください。これにより、個々のシャードへの過負荷を回避し、システムの安定性を維持できます。シャード設計およびインデックス作成に関するベストプラクティスについては、「numShards パラメーターの説明」をご参照ください。この文では、
addressフィールドに IK アナライザを用いたトークン化が適用されています。デフォルトでは、Lindorm は検索インデックスをバックグラウンドで非同期に構築します。テーブルに格納されている既存データ量が多いほど、構築にかかる時間は長くなります。同期的にインデックスを構築する場合は、文末に
SYNCキーワードを追加します。CREATE INDEX 文の実行時に発生する一般的なエラーとその解決方法については、「よくある質問」をご参照ください。
テーブルの検索インデックス情報を照会します。
SHOW INDEX FROM search_table;次の結果が返されます:
+---------------+--------------+------------+-------------+------------+---------------+------------------------------------+-----------+-------------------+ | TABLE_SCHEMA | DATA_TABLE | INDEX_NAME | INDEX_STATE | INDEX_TYPE | INDEX_COVERED | INDEX_COLUMN | INDEX_TTL | INDEX_DESCRIPTION | +---------------+--------------+------------+-------------+------------+---------------+------------------------------------+-----------+-------------------+ | searchindex_db| search_table | idx | BUILDING | SEARCH | NA | address,city,age,gender,name,email | 0 | | +---------------+--------------+------------+-------------+------------+---------------+------------------------------------+-----------+-------------------+説明構築中の検索インデックスは状態として
BUILDINGを表示します。構築が完了すると、状態はACTIVEに変更されます。返される各フィールドの詳細については、「SHOW INDEX」をご参照ください。インデックス構築の進行状況は、LTS コンソールから確認できます。手順については、「検索インデックスのフルビルド進捗の確認方法」をご参照ください。
データを照会します。その他のクエリ例については、「検索インデックスを用いたワイドテーブルデータの照会」をご参照ください。
SELECT * FROM search_table WHERE name='Wang' AND age > 18 AND city='Hangzhou';次の結果が返されます:
+---------+--------+-----+--------+--------------+------------------+------+ | user_id | name | age | gender | address | email | city | +---------+--------+-----+--------+--------------+------------------+------+ | 20 | Wang | 28 | M | Binjiang District, Hangzhou | a***@example.net | Hangzhou | +---------+--------+-----+--------+--------------+------------------+------+検索インデックスの削除 を実行します。
重要LindormTable バージョン 2.7.7 より前の場合、まず
ALTER INDEX IF EXISTS idx ON search_table DISABLED;を実行してインデックスを無効化する必要があります。無効化後、インデックスの状態はDISABLEDになります。再び有効化するには、ALTER INDEX IF EXISTS idx ON search_table REBUILD;を実行します。DROP INDEX IF EXISTS idx ON search_table;
動的カラムの使用
動的カラムの有効化 を実行します。
ALTER TABLE search_table SET 'DYNAMIC_COLUMNS' = 'true';動的カラムを追加します。動的カラムは、検索インデックスに明示的に含める必要があります。この例では、テーブル作成時に定義されていない
passwordカラムを動的カラムとして追加します。新しい検索インデックスを作成し、動的カラムを含めます。
CREATE INDEX idx USING SEARCH ON search_table(user_id,name,age,gender,password);すでに検索インデックスが存在する場合は、ALTER INDEX 文を使用して動的カラムを追加します。
ALTER INDEX idx ON search_table ADD COLUMNS(password);
動的カラムへのデータ書き込み を実行します。
passwordカラムへは、HexString 形式でのみデータを書き込むことができます。UPSERT INTO search_table (user_id,name,age,gender,address,email,city,password) VALUES (30, 'Wang', 38, 'F', 'Nanshan District, Shenzhen', 'a***@example.net', 'Shenzhen', 'ef0011');動的カラムの照会 を実行します。
passwordカラムは、データが HexString 形式で格納されている場合のみ照会可能です。SELECT * FROM search_table WHERE password='ef0011' LIMIT 1;次の結果が返されます:
+---------+--------+-----+--------+--------------+------------------+------+----------+ | user_id | name | age | gender | address | email | city | password | +---------+--------+-----+--------+--------------+------------------+------+----------+ | 30 | Wang | 38 | F | Nanshan District, Shenzhen | a***@example.net | Shenzhen | 0xef0011 | +---------+--------+-----+--------+--------------+------------------+------+----------+
ワイルドカードカラムの使用
ワイルドカードカラムとは、名前にワイルドカード文字を含む特殊なカラムです。ワイルドカードカラムを定義すると、各カラムを事前に定義することなく、ワイルドカードルールに一致する任意のカラムにデータを書き込むことができます。カラム名が特定のパターンに従う多数のカラムにデータを書き込む必要がある場合に便利です。詳細については、「ワイルドカードカラム」をご参照ください。
ワイドテーブルの作成およびワイルドカードカラムの定義 を実行します。この例では、ワイルドカードカラム
info_*およびaddress_*を定義します。CREATE TABLE search_table (user_id BIGINT, name VARCHAR, age SMALLINT, `info_*` VARCHAR, `address_*` VARCHAR, PRIMARY KEY (user_id)) WITH (wildcard_column='info_*,address_*');検索インデックスにワイルドカードカラムを追加します。
address_*ワイルドカードカラムをトークン化カラムとして設定します。CREATE INDEX idx USING SEARCH ON search_table (name,age,`info_*`,`address_*`(type=text, analyzer=ik));ワイルドカードカラムへのデータ書き込みを行います。
info_gender、info_email、info_cityの各カラムはワイルドカードカラムinfo_*に一致します。address_detailカラムはワイルドカードカラムaddress_*に一致します。これらのカラムは事前に定義する必要はありません。データを書き込む際に、自動的に対応するワイルドカードカラムにマッチし、データの型やトークン化設定などの属性を継承します。UPSERT INTO search_table (user_id,name,age,info_gender,address_detail,info_email,info_city) VALUES (1, 'Zhang', 18, 'M', 'Chaoyang District, Beijing', 'a***@example.net', 'Beijing'); UPSERT INTO search_table (user_id,name,age,info_gender,address_detail,info_email,info_city) VALUES (6, 'Li', 32, 'M', 'Yuhang District, Hangzhou', 'a***@example.net', 'Hangzhou'); UPSERT INTO search_table (user_id,name,age,info_gender,address_detail,info_email,info_city) VALUES (20, 'Wang', 28, 'M', 'Binjiang District, Hangzhou', 'a***@example.net', 'Hangzhou'); UPSERT INTO search_table (user_id,name,age,info_gender,address_detail,info_email,info_city) VALUES (28, 'Chen', 36, 'F', 'Nanshan District, Shenzhen', 'a***@example.net', 'Shenzhen');ワイルドカードカラムの照会を行います。
SELECT * FROM search_table WHERE name='Wang' AND age > 18 AND info_city='Hangzhou' LIMIT 10;次の結果が返されます:
+---------+--------+-----+----------------+-----------+------------------+-------------+ | user_id | name | age | address_detail | info_city | info_email | info_gender | +---------+--------+-----+----------------+-----------+------------------+-------------+ | 20 | Wang | 28 | Binjiang District, Hangzhou | Hangzhou | a***@example.net | M | +---------+--------+-----+----------------+-----------+------------------+-------------+説明クエリが検索インデックスを使用しているかどうかを確認するには、次の EXPLAIN 文 を実行します:
EXPLAIN SELECT * FROM search_table WHERE name='Wang' AND age > 18 AND info_city='Hangzhou' LIMIT 10;。
データ更新間隔の設定
検索インデックスは最終的な整合性(eventual consistency)を提供します。ワイドテーブルに書き込まれたデータは、1 回の更新サイクル後に初めて検索インデックス経由で検索可能になります。
LindormSearch はバックグラウンドで固定間隔でデータ更新を実行します。デフォルトの更新間隔は 15 秒です。この間隔を短縮すると、データ書き込みから検索可能になるまでの時間が短縮されますが、同時に LindormSearch への負荷も増加します。リソース使用量およびビジネス要件に応じて、適切な設定値を選択してください。
データ更新間隔の調整は、LindormTable バージョン 2.8.6.1 以降でサポートされています。現在のバージョンの確認またはアップグレードについては、「LindormTable バージョンガイド」および「マイナーバージョンの更新」をご参照ください。
データ更新間隔は、インデックスプロパティ SEARCH_INDEX_VISIBILITY_TRIGGER_INTERVAL によって制御されます。
既存の検索インデックスに対しては、ALTER INDEX を使用してプロパティを調整します:
ALTER INDEX idx ON search_table SET SEARCH_INDEX_VISIBILITY_TRIGGER_INTERVAL='1s';新規検索インデックスを作成する際は、WITH 句を用いてプロパティを設定します:
CREATE INDEX idx USING SEARCH ON search_table (name) WITH (SEARCH_INDEX_VISIBILITY_TRIGGER_INTERVAL='1s');現在のデータ更新間隔は、SHOW INDEX を使用して確認できます:
SHOW INDEX FROM search_table;