MySQLコマンドやSQL文に関する各種メモ書き:タグ「全文検索」での検索

MariaDB 標準の 全文検索 FULLTEXT インデックスを張って高速検索する

● 全文テキストの最小マッチ文字をセットする

最小マッチ文字を2文字にセットする

[mysqld]
innodb_ft_min_token_size=2
ft_min_word_len=2

● MariaDB 標準の 全文検索 FULLTEXT インデックスを張って高速検索する

ALTER TABLE `テーブル名` ADD FULLTEXT(`カラム名`);

● 検索してみる

通常の検索 LIKE検索(遅い)

SELECT item_name AS `numrows`
FROM `item_dt`
WHERE
`item_name` LIKE '%SSD256GB%';

全文検索(速い)

SELECT item_name AS `numrows`
FROM `item_dt`
WHERE
MATCH(`item_name`) AGAINST( "+SSD256GB" IN BOOLEAN MODE);

● インデックスを再構築する

インデックスを削除 → インデックスを再度作成 を行ないます。

・1.インデックス一覧を表示

show index from 【テーブル名】;

・2.インデックスを削除

DROP INDEX 【インデックス名】 ON 【テーブル名】;

・3.インデックスを作成

ALTER TABLE `テーブル名` ADD FULLTEXT(`カラム名`);
No.1893
11/06 11:15

edit

全文検索

MySQL(Maria DB)で全文検索 (FULLTEXT INDEX) を使用する

● Mroongaのインストール

kusanagiの場合

kusanagi addon install mroonga

kusanagiを使ってない場合
こちらに詳しく載っています
http://asuki-yt.hatenablog.jp/entry/2018/04/03/200000

● (設定:1)MySQLの全文検索の「検索マッチ最小文字数」の設定を行う

https://dev.mysql.com/doc/refman/5.6/ja/fulltext-fine-tuning.html

単語の最小長と最大長の構成 インデックスが付けられる単語の最小長および最大長は、InnoDB 検索インデックスの場合は innodb_ft_min_token_size および innodb_ft_max_token_size、MyISAM 検索インデックスの場合は ft_min_word_len および ft_max_word_len で定義されます。これらのオプションのいずれかを変更したら、変更を有効にするために FULLTEXT インデックスを再構築してください。たとえば、2 文字の単語を検索可能にするには、オプションファイルに次の行を配置します。

[mysqld]
innodb_ft_min_token_size=2
ft_min_word_len=2

設定ファイル my.cnf を編集する

vi my.cnf
[mysqld]
# innoDBの全文検索 最小文字数
innodb_ft_min_token_size=1

# MyISAMの全文検索 最小文字数
ft_min_word_len=1

mysqlのリスタート

systemctl restart mysql

設定の確認

 show variables like '%ft%';

● (設定:2)全文検索インデックスの作成

alter table MY-TABLE add fulltext(`COLUMN-NAME`);

● (設定:2)全文検索インデックスの確認

show index in MY-TABLE;

● (設定:3)現在のDB(のテーブル)のストレージエンジンを Mroonga に変更する

ストレージエンジンを変更しなくても一見日本語全文検索ができているように見えますが、 検索文字の前後に半角文字があるデータしかマッチしません。 ストレージエンジンを Mroonga に変更する事で前後に全角文字があるデータもマッチするようになります。

現在のDB(のテーブル)のストレージエンジンを確認する

use information_schema;
select table_schema, table_name, engine from TABLES WHERE table_schema = 'MY-DB';

ストレージエンジンを Mroonga に変更する

use MY-DB
ALTER TABLE `MY-TABLE` ENGINE = Mroonga;

● 全文検索の実行

https://dev.mysql.com/doc/refman/5.6/ja/fulltext-search.html

実行モードには下記の4つありますが

IN NATURAL LANGUAGE MODE
IN NATURAL LANGUAGE MODE WITH QUERY EXPANSION
IN BOOLEAN MODE
WITH QUERY EXPANSION

これを一番よく使います。

select * from TABLE-NAME where match(COLUMN-NAME) against( '+検索文字' IN BOOLEAN MODE );

● OR 検索

select * from TABLE-NAME where match(COLUMN-NAME) against( '電車 バス' IN BOOLEAN MODE );

● AND 検索

select * from TABLE-NAME where match(COLUMN-NAME) against( '+京都 +カフェ' IN BOOLEAN MODE );

● MariaDBの日本語全文検索は実際にどれくらい早いのか?

実データで検証しました

select count(*) from MY-TABLE
+----------+
| count(*) |
+----------+
|  3431394 |
+----------+

340万データを持つテーブルを検索してみます。

・日本語全文検索

select count(*) from MY-TABLE where match(item_name) against( '+キーワード' IN BOOLEAN MODE );
+----------+
| count(*) |
+----------+
|     1451 |
+----------+
1 row in set (0.05 sec)

・LIKE検索

select count(*) from MY-TABLE where item_name like '%キーワード%';
+----------+
| count(*) |
+----------+
|     1451 |
+----------+
1 row in set (26.32 sec)

● Mroongaの最適化

http://mroonga.org/ja/docs/reference/optimizations.html

No.1299
10/26 20:06

edit

全文検索

MySQL標準の日本語全文検索を使用する

MySQL5.7以降ではデフォルトで InnoDBで日本語全文検索が使えるようになりました。

● MySQLのバージョンを確認する

SELECT version();

● FULLTEXT インデックスを貼る

例1. テーブル「mytable」のカラム「title」「content」に全文検索用インデックスを作成する

ALTER TABLE mytable ADD FULLTEXT KEY (title, content) WITH PARSER ngram;

例2. インデックス名を指定して全文検索用インデックスを作成する

対象テーブル「item_table」対象カラム「item_name」
インデックス名「item_name_fulltext_idx」
でフルテキストインデックスを作成する

CREATE FULLTEXT INDEX `item_name_fulltext_idx` ON `item_table` (`item_name`) WITH PARSER ngram;

● 全文検索の設定

デフォルトは4文字以上の単語が対象ですがその対象を2文字に変更することができます。

1. my.cnf に設定を記述

/etc/my.cnf

[mysqld]
innodb_ft_min_token_size=2

2. MySQLをリスタート

3. FULLTEXTインデックスを貼り直す

一度削除してから再度作成すればOKです。

・インデックスの貼り直し

DROP INDEX item_name_fulltext_idx ON item_table ;
CREATE FULLTEXT INDEX `item_name_fulltext_idx` ON `item_table` (`item_name`) WITH PARSER ngram ;
No.1274
10/26 20:06

edit

全文検索