MariaDB 10で部分テキスト検索を高速化するFULLTEXTインデックスのプログラミング解説
MariaDB 10におけるFULLTEXTインデックスのプログラミング解説
MariaDB 10 は、MyISAM、Aria、InnoDB、Mroonga などのストレージエンジンで、部分テキスト検索を可能にする FULLTEXT インデックスをサポートしています。
このガイドでは、MariaDB 10 で FULLTEXT インデックスを作成、使用、および管理する方法を分かりやすく日本語で説明します。
FULLTEXT インデックスは、テキスト列内の単語やフレーズを素早く検索するために使用される特殊なタイプのインデックスです。 従来のインデックスとは異なり、FULLTEXT インデックスは、完全一致だけでなく、部分一致、接頭辞一致、接尾辞一致などの高度な検索をサポートします。
FULLTEXT インデックスの利点
- 部分テキスト検索の高速化: FULLTEXT インデックスを使用すると、部分テキスト検索を大幅に高速化できます。
- あいまい検索のサポート: FULLTEXT インデックスは、スペルミスや誤字脱字を含むあいまい検索をサポートします。
- 自然言語検索のサポート: FULLTEXT インデックスは、ストップワードの除去やシノニムの展開などの自然言語処理機能をサポートします。
- サポートされるストレージエンジン: FULLTEXT インデックスは、MyISAM、Aria、InnoDB、Mroonga などのストレージエンジンでのみサポートされています。
- インデックスサイズ: FULLTEXT インデックスは、通常のインデックスよりもサイズが大きくなります。
- 更新パフォーマンス: FULLTEXT インデックスの更新は、通常のインデックスの更新よりも時間がかかります。
FULLTEXT インデックスは、CREATE TABLE ステートメントまたは ALTER TABLE ステートメントを使用して作成できます。
CREATE TABLE ステートメントを使用した FULLTEXT インデックスの作成
CREATE TABLE your_table (
id INT PRIMARY KEY AUTO_INCREMENT,
title VARCHAR(255) NOT NULL,
content TEXT NOT NULL,
FULLTEXT INDEX (title, content)
);
ALTER TABLE your_table
ADD FULLTEXT INDEX ft_idx (title, content);
FULLTEXT インデックスを使用して、部分テキスト検索を実行できます。 MATCH() 関数を使用して、検索条件を指定します。
例:
SELECT * FROM your_table
WHERE MATCH(title, content) AGAINST ('search term' IN BOOLEAN MODE);
ALTER TABLE your_table
MODIFY INDEX ft_idx FOR (title, content);
DROP INDEX ft_idx ON your_table;
FULLTEXT インデックスのパフォーマンスを向上させるには、次の方法があります。
- 適切なストレージエンジンを選択する: MyISAM は、FULLTEXT インデックスのパフォーマンスが最も優れています。
- インデックスサイズを小さくする: 使用しない単語やフレーズを含むインデックスを作成しないようにします。
- インデックスを定期的に更新する: データが頻繁に変更される場合は、インデックスを定期的に更新します。
FULLTEXT インデックスは、MariaDB 10 で部分テキスト検索を高速化するための強力なツールです。 このガイドで説明した手順に従って、FULLTEXT インデックスを作成、使用、および管理し、アプリケーションのパフォーマンスを向上させることができます。
MariaDB 10におけるFULLTEXTインデックスのサンプルコード
テーブルの作成
CREATE TABLE books (
id INT PRIMARY KEY AUTO_INCREMENT,
title VARCHAR(255) NOT NULL,
content TEXT NOT NULL,
FULLTEXT INDEX (title, content)
);
データの挿入
INSERT INTO books (title, content)
VALUES ('The Lord of the Rings', 'The Lord of the Rings is a fantasy novel by English author J. R. R. Tolkien. ...'),
('The Hobbit', 'The Hobbit is a fantasy novel by English author J. R. R. Tolkien. ...'),
('The Silmarillion', 'The Silmarillion is a work of fantasy set in J. R. R. Tolkien's fictional universe of Middle-earth. ...');
部分テキスト検索
SELECT * FROM books
WHERE MATCH(title, content) AGAINST ('tolkien' IN BOOLEAN MODE);
このクエリは、title
または content
列に "tolkien" という単語を含むすべての書籍を返します。
接頭辞一致検索
SELECT * FROM books
WHERE MATCH(title, content) AGAINST ('lord*' IN BOOLEAN MODE);
SELECT * FROM books
WHERE MATCH(title, content) AGAINST ('*rings' IN BOOLEAN MODE);
フレーズ検索
SELECT * FROM books
WHERE MATCH(title, content) AGAINST ('the lord of the rings' IN BOOLEAN MODE);
除外ワード
SELECT * FROM books
WHERE MATCH(title, content) AGAINST ('tolkien -lord' IN BOOLEAN MODE);
同義語
SELECT * FROM books
WHERE MATCH(title, content) AGAINST ('magic synonym wizard' IN BOOLEAN MODE);
ワイルドカード検索
SELECT * FROM books
WHERE MATCH(title, content) AGAINST ('the b*t' IN BOOLEAN MODE);
この例は、MariaDB 10 で FULLTEXT インデックスを使用して部分テキスト検索を実行する方法をいくつか示しています。 詳細については、MariaDB Knowledge Base の FULL-Text Indexes を参照してください。
FULLTEXT インデックスのこれらの制限事項を回避するには、次の代替方法を検討してください。
LIKE 演算子は、部分テキスト検索を実行するためのシンプルな方法です。 ただし、FULLTEXT インデックスほど効率的ではありません。
SELECT * FROM your_table
WHERE title LIKE '%search term%';
REGEXP 演算子は、より複雑な部分テキスト検索を実行するために使用できます。 LIKE 演算子よりも効率的ですが、FULLTEXT インデックスほど効率的ではありません。
SELECT * FROM your_table
WHERE title REGEXP 'search term';
検索エンジン
Sphinx や Elasticsearch などの検索エンジンは、FULLTEXT インデックスよりも高速でスケーラブルな部分テキスト検索を提供できます。 ただし、検索エンジンは、データベースとは別のシステムをインストールして構成する必要があります。
フルテーブルスキャン
データ量が少ない場合は、フルテーブルスキャンを実行して部分テキスト検索を実行することもできます。 ただし、この方法は、データ量が多い場合は非効率的です。
最適な方法は、アプリケーションの要件によって異なります。 データ量が少ない場合は、LIKE 演算子または REGEXP 演算子が十分な場合があります。 データ量が多い場合は、FULLTEXT インデックスまたは検索エンジンを使用する必要があります。
mysql mariadb