ここの手順で Ubuntu の設定をすると MySQL データベース管理システムがインストールされています.このページでは MySQL を使った検索方法などを確認しよう.
ここでは形態素解析器の代表格である MeCab を使ったフルテキストインデックスを MySQL で利用する方法について説明します.すでにここの手順に従って MeCab がインストールされているものとします.
MySQL と MeCab をインストールしただけでは,MySQL に MeCab 用のプラグインはインストールされていないはずです.まずそのことを確認しておきます.Ngram のプラグインは利用可能であることはわかりました.
vagrant@ubuntu2204 ~ $ mysql -u dbuser -p ⏎ Enter password: # パスワードを入力(表示されない) Welcome to the MySQL monitor. Commands end with ; or \g. Your MySQL connection id is 16 Server version: 8.0.31-0ubuntu0.22.04.1 (Ubuntu) Copyright (c) 2000, 2022, Oracle and/or its affiliates. Oracle is a registered trademark of Oracle Corporation and/or its affiliates. Other names may be trademarks of their respective owners. Type 'help;' or '\h' for help. Type '\c' to clear the current input statement. mysql> SHOW PLUGINS; ⏎ +---------------------------------+----------+--------------------+----------------+---------+ | Name | Status | Type | Library | License | +---------------------------------+----------+--------------------+----------------+---------+ | binlog | ACTIVE | STORAGE ENGINE | NULL | GPL | | mysql_native_password | ACTIVE | AUTHENTICATION | NULL | GPL | | sha256_password | ACTIVE | AUTHENTICATION | NULL | GPL | | caching_sha2_password | ACTIVE | AUTHENTICATION | NULL | GPL | | sha2_cache_cleaner | ACTIVE | AUDIT | NULL | GPL | | daemon_keyring_proxy_plugin | ACTIVE | DAEMON | NULL | GPL | | CSV | ACTIVE | STORAGE ENGINE | NULL | GPL | | MEMORY | ACTIVE | STORAGE ENGINE | NULL | GPL | | InnoDB | ACTIVE | STORAGE ENGINE | NULL | GPL | | INNODB_TRX | ACTIVE | INFORMATION SCHEMA | NULL | GPL | | INNODB_CMP | ACTIVE | INFORMATION SCHEMA | NULL | GPL | | INNODB_CMP_RESET | ACTIVE | INFORMATION SCHEMA | NULL | GPL | | INNODB_CMPMEM | ACTIVE | INFORMATION SCHEMA | NULL | GPL | | INNODB_CMPMEM_RESET | ACTIVE | INFORMATION SCHEMA | NULL | GPL | | INNODB_CMP_PER_INDEX | ACTIVE | INFORMATION SCHEMA | NULL | GPL | | INNODB_CMP_PER_INDEX_RESET | ACTIVE | INFORMATION SCHEMA | NULL | GPL | | INNODB_BUFFER_PAGE | ACTIVE | INFORMATION SCHEMA | NULL | GPL | | INNODB_BUFFER_PAGE_LRU | ACTIVE | INFORMATION SCHEMA | NULL | GPL | | INNODB_BUFFER_POOL_STATS | ACTIVE | INFORMATION SCHEMA | NULL | GPL | | INNODB_TEMP_TABLE_INFO | ACTIVE | INFORMATION SCHEMA | NULL | GPL | | INNODB_METRICS | ACTIVE | INFORMATION SCHEMA | NULL | GPL | | INNODB_FT_DEFAULT_STOPWORD | ACTIVE | INFORMATION SCHEMA | NULL | GPL | | INNODB_FT_DELETED | ACTIVE | INFORMATION SCHEMA | NULL | GPL | | INNODB_FT_BEING_DELETED | ACTIVE | INFORMATION SCHEMA | NULL | GPL | | INNODB_FT_CONFIG | ACTIVE | INFORMATION SCHEMA | NULL | GPL | | INNODB_FT_INDEX_CACHE | ACTIVE | INFORMATION SCHEMA | NULL | GPL | | INNODB_FT_INDEX_TABLE | ACTIVE | INFORMATION SCHEMA | NULL | GPL | | INNODB_TABLES | ACTIVE | INFORMATION SCHEMA | NULL | GPL | | INNODB_TABLESTATS | ACTIVE | INFORMATION SCHEMA | NULL | GPL | | INNODB_INDEXES | ACTIVE | INFORMATION SCHEMA | NULL | GPL | | INNODB_TABLESPACES | ACTIVE | INFORMATION SCHEMA | NULL | GPL | | INNODB_COLUMNS | ACTIVE | INFORMATION SCHEMA | NULL | GPL | | INNODB_VIRTUAL | ACTIVE | INFORMATION SCHEMA | NULL | GPL | | INNODB_CACHED_INDEXES | ACTIVE | INFORMATION SCHEMA | NULL | GPL | | INNODB_SESSION_TEMP_TABLESPACES | ACTIVE | INFORMATION SCHEMA | NULL | GPL | | MyISAM | ACTIVE | STORAGE ENGINE | NULL | GPL | | MRG_MYISAM | ACTIVE | STORAGE ENGINE | NULL | GPL | | PERFORMANCE_SCHEMA | ACTIVE | STORAGE ENGINE | NULL | GPL | | TempTable | ACTIVE | STORAGE ENGINE | NULL | GPL | | ARCHIVE | ACTIVE | STORAGE ENGINE | NULL | GPL | | BLACKHOLE | ACTIVE | STORAGE ENGINE | NULL | GPL | | FEDERATED | DISABLED | STORAGE ENGINE | NULL | GPL | | ngram | ACTIVE | FTPARSER | NULL | GPL | | mysqlx_cache_cleaner | ACTIVE | AUDIT | NULL | GPL | | mysqlx | ACTIVE | DAEMON | NULL | GPL | | auth_socket | ACTIVE | AUTHENTICATION | auth_socket.so | GPL | +---------------------------------+----------+--------------------+----------------+---------+ 46 rows in set (0.00 sec) mysql> EXIT ⏎ Bye vagrant@ubuntu2204 ~ $
MySQL から MeCab を利用するために,/etc/mecabrc
を /etc/mysql/mecabrc
としてコピーします.
vagrant@ubuntu2204 ~ $ ls -l /etc | grep mecab ⏎ -rw-r--r-- 1 root root 288 3月 18 2022 mecabrc vagrant@ubuntu2204 ~ $ sudo cp /etc/mecabrc /etc/mysql/mecabrc ⏎
コピーできたことを確認して vi
エディタ(あるいは好みのエディタ)で編集します.
vagrant@ubuntu2204 ~ $ cd /etc/mysql ⏎
vagrant@ubuntu2204 mysql $ ls -l ⏎
total 28
drwxr-xr-x 2 root root 4096 10月 27 09:37 conf.d
-rwxr-xr-x 1 root root 120 10月 19 20:35 debian-start
-rw------- 1 root root 317 10月 27 09:37 debian.cnf
-rw-r--r-- 1 root root 288 10月 27 12:03 mecabrc
lrwxrwxrwx 1 root root 24 10月 27 09:37 my.cnf -> /etc/alternatives/my.cnf
-rw-r--r-- 1 root root 839 10月 20 2020 my.cnf.fallback
-rw-r--r-- 1 root root 682 3月 11 2021 mysql.cnf
drwxr-xr-x 2 root root 4096 10月 27 12:08 mysql.conf.d
vagrant@ubuntu2204 mysql $ sudo vi mecabrc ⏎
次のように辞書のディレクトリ(フォルダ)を指定します.行の先頭にある「;」はその行がコメント行であることを意味します.つまり,7 行目だけが実際に必要な内容です.
/etc/mysql/mecabrc
;
; Configuration file of MeCab
;
; $Id: mecabrc.in,v 1.3 2006/05/29 15:36:08 taku-ku Exp $;
;
; dicdir = /var/lib/mecab/dic/debian
dicdir = /var/lib/mecab/dic/ipadic-utf8
; dicdir = /usr/lib/x86_64-linux-gnu/mecab/dic/mecab-ipadic-neologd
; userdic = /home/foo/bar/user.dic
; output-format-type = wakati
; input-buffer-size = 8192
; node-format = %m\n
; bos-format = %S\n
; eos-format = EOS\n
さらに,/etc/mysql/mysql.conf.d
フォルダに mecabrc.cnf
ファイルを作成して編集します.
vagrant@ubuntu2204 ~ $ cd /etc/mysql/mysql.conf.d ⏎ vagrant@ubuntu2204 mysql.conf.d $ ls -l ⏎ total 8 -rw-r--r-- 1 root root 132 3月 11 2021 mysql.cnf -rw-r--r-- 1 root root 2230 10月 27 09:38 mysqld.cnf vagrant@ubuntu2204 mysql.conf.d $ sudo touch mecabrc.cnf ⏎ vagrant@ubuntu2204 mysql.conf.d $ sudo vi mecabrc.cnf ⏎
次のような内容を記述します.なお,フルテキストインデックスの最小トークンサイズを1に設定しています.このデフォルト値は3です.日本語文字を使用する場合は1に設定すると良いようです.
/etc/mysql/mysql.conf.d/mecabrc.cnf
[mysqld]
loose-mecab-rc-file=/etc/mysql/mecabrc
innodb_ft_min_token_size=1
設定変更を有効化するために MySQL を再起動します.
vagrant@ubuntu2204 mysql $ cd ⏎
vagrant@ubuntu2204 ~ $ sudo systemctl restart mysql ⏎
vagrant@ubuntu2204 ~ $ sudo systemctl status mysql ⏎
● mysql.service - MySQL Community Server
Loaded: loaded (/lib/systemd/system/mysql.service; enabled; vendor preset: enabled)
Active: active (running) since Thu 2022-10-27 12:11:59 JST; 5s ago
Process: 14104 ExecStartPre=/usr/share/mysql/mysql-systemd-start pre (code=exited, status=0/SUCCESS)
Main PID: 14112 (mysqld)
Status: "Server is operational"
Tasks: 39 (limit: 2236)
Memory: 369.4M
CPU: 948ms
CGroup: /system.slice/mysql.service
└─14112 /usr/sbin/mysqld
10月 27 12:11:58 ubuntu2204.localdomain systemd[1]: Starting MySQL Community Server...
10月 27 12:11:59 ubuntu2204.localdomain systemd[1]: Started MySQL Community Server.
vagrant@ubuntu2204 ~ $
プラグインをインストールするために root で MySQL にログインします.
vagrant@ubuntu2204 ~ $ mysql -u root -p ⏎
Enter password: # パスワードを入力(表示されない)
Welcome to the MySQL monitor. Commands end with ; or \g.
Your MySQL connection id is 8
Server version: 8.0.31-0ubuntu0.22.04.1 (Ubuntu)
Copyright (c) 2000, 2022, Oracle and/or its affiliates.
Oracle is a registered trademark of Oracle Corporation and/or its
affiliates. Other names may be trademarks of their respective
owners.
Type 'help;' or '\h' for help. Type '\c' to clear the current input statement.
mysql> SHOW PLUGINS; ⏎
+---------------------------------+----------+--------------------+----------------+---------+
| Name | Status | Type | Library | License |
+---------------------------------+----------+--------------------+----------------+---------+
| binlog | ACTIVE | STORAGE ENGINE | NULL | GPL |
| mysql_native_password | ACTIVE | AUTHENTICATION | NULL | GPL |
| sha256_password | ACTIVE | AUTHENTICATION | NULL | GPL |
| caching_sha2_password | ACTIVE | AUTHENTICATION | NULL | GPL |
| sha2_cache_cleaner | ACTIVE | AUDIT | NULL | GPL |
| daemon_keyring_proxy_plugin | ACTIVE | DAEMON | NULL | GPL |
| CSV | ACTIVE | STORAGE ENGINE | NULL | GPL |
| MEMORY | ACTIVE | STORAGE ENGINE | NULL | GPL |
| InnoDB | ACTIVE | STORAGE ENGINE | NULL | GPL |
| INNODB_TRX | ACTIVE | INFORMATION SCHEMA | NULL | GPL |
| INNODB_CMP | ACTIVE | INFORMATION SCHEMA | NULL | GPL |
| INNODB_CMP_RESET | ACTIVE | INFORMATION SCHEMA | NULL | GPL |
| INNODB_CMPMEM | ACTIVE | INFORMATION SCHEMA | NULL | GPL |
| INNODB_CMPMEM_RESET | ACTIVE | INFORMATION SCHEMA | NULL | GPL |
| INNODB_CMP_PER_INDEX | ACTIVE | INFORMATION SCHEMA | NULL | GPL |
| INNODB_CMP_PER_INDEX_RESET | ACTIVE | INFORMATION SCHEMA | NULL | GPL |
| INNODB_BUFFER_PAGE | ACTIVE | INFORMATION SCHEMA | NULL | GPL |
| INNODB_BUFFER_PAGE_LRU | ACTIVE | INFORMATION SCHEMA | NULL | GPL |
| INNODB_BUFFER_POOL_STATS | ACTIVE | INFORMATION SCHEMA | NULL | GPL |
| INNODB_TEMP_TABLE_INFO | ACTIVE | INFORMATION SCHEMA | NULL | GPL |
| INNODB_METRICS | ACTIVE | INFORMATION SCHEMA | NULL | GPL |
| INNODB_FT_DEFAULT_STOPWORD | ACTIVE | INFORMATION SCHEMA | NULL | GPL |
| INNODB_FT_DELETED | ACTIVE | INFORMATION SCHEMA | NULL | GPL |
| INNODB_FT_BEING_DELETED | ACTIVE | INFORMATION SCHEMA | NULL | GPL |
| INNODB_FT_CONFIG | ACTIVE | INFORMATION SCHEMA | NULL | GPL |
| INNODB_FT_INDEX_CACHE | ACTIVE | INFORMATION SCHEMA | NULL | GPL |
| INNODB_FT_INDEX_TABLE | ACTIVE | INFORMATION SCHEMA | NULL | GPL |
| INNODB_TABLES | ACTIVE | INFORMATION SCHEMA | NULL | GPL |
| INNODB_TABLESTATS | ACTIVE | INFORMATION SCHEMA | NULL | GPL |
| INNODB_INDEXES | ACTIVE | INFORMATION SCHEMA | NULL | GPL |
| INNODB_TABLESPACES | ACTIVE | INFORMATION SCHEMA | NULL | GPL |
| INNODB_COLUMNS | ACTIVE | INFORMATION SCHEMA | NULL | GPL |
| INNODB_VIRTUAL | ACTIVE | INFORMATION SCHEMA | NULL | GPL |
| INNODB_CACHED_INDEXES | ACTIVE | INFORMATION SCHEMA | NULL | GPL |
| INNODB_SESSION_TEMP_TABLESPACES | ACTIVE | INFORMATION SCHEMA | NULL | GPL |
| MyISAM | ACTIVE | STORAGE ENGINE | NULL | GPL |
| MRG_MYISAM | ACTIVE | STORAGE ENGINE | NULL | GPL |
| PERFORMANCE_SCHEMA | ACTIVE | STORAGE ENGINE | NULL | GPL |
| TempTable | ACTIVE | STORAGE ENGINE | NULL | GPL |
| ARCHIVE | ACTIVE | STORAGE ENGINE | NULL | GPL |
| BLACKHOLE | ACTIVE | STORAGE ENGINE | NULL | GPL |
| FEDERATED | DISABLED | STORAGE ENGINE | NULL | GPL |
| ngram | ACTIVE | FTPARSER | NULL | GPL |
| mysqlx_cache_cleaner | ACTIVE | AUDIT | NULL | GPL |
| mysqlx | ACTIVE | DAEMON | NULL | GPL |
| auth_socket | ACTIVE | AUTHENTICATION | auth_socket.so | GPL |
+---------------------------------+----------+--------------------+----------------+---------+
46 rows in set (0.00 sec)
mysql>
プラグインをインストールして,インストールできたことも確認します.
mysql> INSTALL PLUGIN mecab SONAME 'libpluginmecab.so'; ⏎
Query OK, 0 rows affected (0.03 sec)
mysql> SHOW PLUGINS; ⏎
+---------------------------------+----------+--------------------+-------------------+---------+
| Name | Status | Type | Library | License |
+---------------------------------+----------+--------------------+-------------------+---------+
| binlog | ACTIVE | STORAGE ENGINE | NULL | GPL |
| mysql_native_password | ACTIVE | AUTHENTICATION | NULL | GPL |
| sha256_password | ACTIVE | AUTHENTICATION | NULL | GPL |
| caching_sha2_password | ACTIVE | AUTHENTICATION | NULL | GPL |
| sha2_cache_cleaner | ACTIVE | AUDIT | NULL | GPL |
| daemon_keyring_proxy_plugin | ACTIVE | DAEMON | NULL | GPL |
| CSV | ACTIVE | STORAGE ENGINE | NULL | GPL |
| MEMORY | ACTIVE | STORAGE ENGINE | NULL | GPL |
| InnoDB | ACTIVE | STORAGE ENGINE | NULL | GPL |
| INNODB_TRX | ACTIVE | INFORMATION SCHEMA | NULL | GPL |
| INNODB_CMP | ACTIVE | INFORMATION SCHEMA | NULL | GPL |
| INNODB_CMP_RESET | ACTIVE | INFORMATION SCHEMA | NULL | GPL |
| INNODB_CMPMEM | ACTIVE | INFORMATION SCHEMA | NULL | GPL |
| INNODB_CMPMEM_RESET | ACTIVE | INFORMATION SCHEMA | NULL | GPL |
| INNODB_CMP_PER_INDEX | ACTIVE | INFORMATION SCHEMA | NULL | GPL |
| INNODB_CMP_PER_INDEX_RESET | ACTIVE | INFORMATION SCHEMA | NULL | GPL |
| INNODB_BUFFER_PAGE | ACTIVE | INFORMATION SCHEMA | NULL | GPL |
| INNODB_BUFFER_PAGE_LRU | ACTIVE | INFORMATION SCHEMA | NULL | GPL |
| INNODB_BUFFER_POOL_STATS | ACTIVE | INFORMATION SCHEMA | NULL | GPL |
| INNODB_TEMP_TABLE_INFO | ACTIVE | INFORMATION SCHEMA | NULL | GPL |
| INNODB_METRICS | ACTIVE | INFORMATION SCHEMA | NULL | GPL |
| INNODB_FT_DEFAULT_STOPWORD | ACTIVE | INFORMATION SCHEMA | NULL | GPL |
| INNODB_FT_DELETED | ACTIVE | INFORMATION SCHEMA | NULL | GPL |
| INNODB_FT_BEING_DELETED | ACTIVE | INFORMATION SCHEMA | NULL | GPL |
| INNODB_FT_CONFIG | ACTIVE | INFORMATION SCHEMA | NULL | GPL |
| INNODB_FT_INDEX_CACHE | ACTIVE | INFORMATION SCHEMA | NULL | GPL |
| INNODB_FT_INDEX_TABLE | ACTIVE | INFORMATION SCHEMA | NULL | GPL |
| INNODB_TABLES | ACTIVE | INFORMATION SCHEMA | NULL | GPL |
| INNODB_TABLESTATS | ACTIVE | INFORMATION SCHEMA | NULL | GPL |
| INNODB_INDEXES | ACTIVE | INFORMATION SCHEMA | NULL | GPL |
| INNODB_TABLESPACES | ACTIVE | INFORMATION SCHEMA | NULL | GPL |
| INNODB_COLUMNS | ACTIVE | INFORMATION SCHEMA | NULL | GPL |
| INNODB_VIRTUAL | ACTIVE | INFORMATION SCHEMA | NULL | GPL |
| INNODB_CACHED_INDEXES | ACTIVE | INFORMATION SCHEMA | NULL | GPL |
| INNODB_SESSION_TEMP_TABLESPACES | ACTIVE | INFORMATION SCHEMA | NULL | GPL |
| MyISAM | ACTIVE | STORAGE ENGINE | NULL | GPL |
| MRG_MYISAM | ACTIVE | STORAGE ENGINE | NULL | GPL |
| PERFORMANCE_SCHEMA | ACTIVE | STORAGE ENGINE | NULL | GPL |
| TempTable | ACTIVE | STORAGE ENGINE | NULL | GPL |
| ARCHIVE | ACTIVE | STORAGE ENGINE | NULL | GPL |
| BLACKHOLE | ACTIVE | STORAGE ENGINE | NULL | GPL |
| FEDERATED | DISABLED | STORAGE ENGINE | NULL | GPL |
| ngram | ACTIVE | FTPARSER | NULL | GPL |
| mysqlx_cache_cleaner | ACTIVE | AUDIT | NULL | GPL |
| mysqlx | ACTIVE | DAEMON | NULL | GPL |
| auth_socket | ACTIVE | AUTHENTICATION | auth_socket.so | GPL |
| mecab | ACTIVE | FTPARSER | libpluginmecab.so | GPL |
+---------------------------------+----------+--------------------+-------------------+---------+
47 rows in set (0.00 sec)
mysql> EXIT ⏎
Bye
vagrant@ubuntu2204 ~ $
dbuser でログインし,データベースを選択します.
vagrant@ubuntu2204 ~ $ mysql -u dbuser -p ⏎
Enter password: # パスワードを入力(表示されない)
Welcome to the MySQL monitor. Commands end with ; or \g.
Your MySQL connection id is 9
Server version: 8.0.31-0ubuntu0.22.04.1 (Ubuntu)
Copyright (c) 2000, 2022, Oracle and/or its affiliates.
Oracle is a registered trademark of Oracle Corporation and/or its
affiliates. Other names may be trademarks of their respective
owners.
Type 'help;' or '\h' for help. Type '\c' to clear the current input statement.
mysql> USE testDB; ⏎
Reading table information for completion of table and column names
You can turn off this feature to get a quicker startup with -A
Database changed
mysql>
テーブルを作成するときに MeCab のインデックスも body フィールドに設定します.
mysql> CREATE TABLE mecab_articles (
id INT UNSIGNED AUTO_INCREMENT NOT NULL PRIMARY KEY,
body TEXT,
FULLTEXT (body) WITH PARSER mecab
) ENGINE=InnoDB CHARACTER SET utf8; ⏎
Query OK, 0 rows affected, 1 warning (0.13 sec)
mysql>
テーブルの定義を確認します.
mysql> DESC mecab_articles; ⏎
+-------+--------------+------+-----+---------+----------------+
| Field | Type | Null | Key | Default | Extra |
+-------+--------------+------+-----+---------+----------------+
| id | int unsigned | NO | PRI | NULL | auto_increment |
| body | text | YES | MUL | NULL | |
+-------+--------------+------+-----+---------+----------------+
2 rows in set (0.00 sec)
mysql> SHOW CREATE TABLE mecab_articles\G ⏎
*************************** 1. row ***************************
Table: mecab_articles
Create Table: CREATE TABLE `mecab_articles` (
`id` int unsigned NOT NULL AUTO_INCREMENT,
`body` text,
PRIMARY KEY (`id`),
FULLTEXT KEY `body` (`body`) /*!50100 WITH PARSER `mecab` */
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb3
1 row in set (0.00 sec)
mysql>
12 件のデータを一気に投入します.
mysql> INSERT INTO mecab_articles (body) VALUES ('今日の天気は雨です'), ('明日の天気も雨でしょう'), ('明日の天気も晴れでしょう'), ('今日の天気は晴れです'), ('勤務先の社内自然言語処理勉強会での発表資料です'), ('この文書は自然言語処理の基本として類似文書推薦について説明します'), ('この資料はジャズのライブについてまとめた資料です'), ('自然言語処理の基本を説明します'), ('We consider a software rejuvenation schedule.'), ('We propose an extended warranty service contract.'), ('This model evaluates the quality characteristics of software.'), ('複数の言語に対応した software 開発を勉強します'); ⏎ Query OK, 12 rows affected (0.10 sec) Records: 12 Duplicates: 0 Warnings: 0 mysql>
mysql> SELECT * FROM mecab_articles; ⏎ +----+--------------------------------------------------------------------------------------------------+ | id | body | +----+--------------------------------------------------------------------------------------------------+ | 1 | 今日の天気は雨です | | 2 | 明日の天気も雨でしょう | | 3 | 明日の天気も晴れでしょう | | 4 | 今日の天気は晴れです | | 5 | 勤務先の社内自然言語処理勉強会での発表資料です | | 6 | この文書は自然言語処理の基本として類似文書推薦について説明します | | 7 | この資料はジャズのライブについてまとめた資料です | | 8 | 自然言語処理の基本を説明します | | 9 | We consider a software rejuvenation schedule. | | 10 | We propose an extended warranty service contract. | | 11 | This model evaluates the quality characteristics of software. | | 12 | 複数の言語に対応した software 開発を勉強します | +----+--------------------------------------------------------------------------------------------------+ 12 rows in set (0.00 sec) mysql>
MeCab フルテキストインデックスを利用した全文検索を行います.上で投入したわずか12件のデータでは Ngram を使った検索と検索結果に差は現れませんでした.
mysql> SELECT * FROM mecab_articles
WHERE MATCH(body) AGAINST("software"); ⏎
+----+------------------------------------------------------------------+
| id | body |
+----+------------------------------------------------------------------+
| 9 | We consider a software rejuvenation schedule. |
| 11 | This model evaluates the quality characteristics of software. |
| 12 | 複数の言語に対応した software 開発を勉強します |
+----+------------------------------------------------------------------+
3 rows in set (0.00 sec)
mysql> SELECT * FROM mecab_articles
WHERE MATCH(body) AGAINST("晴れ"); ⏎
+----+--------------------------------------+
| id | body |
+----+--------------------------------------+
| 3 | 明日の天気も晴れでしょう |
| 4 | 今日の天気は晴れです |
+----+--------------------------------------+
2 rows in set (0.00 sec)
mysql> SELECT * FROM mecab_articles
WHERE MATCH(body) AGAINST("自然言語"); ⏎
+----+--------------------------------------------------------------------------------------------------+
| id | body |
+----+--------------------------------------------------------------------------------------------------+
| 5 | 勤務先の社内自然言語処理勉強会での発表資料です |
| 6 | この文書は自然言語処理の基本として類似文書推薦について説明します |
| 8 | 自然言語処理の基本を説明します |
| 12 | 複数の言語に対応した software 開発を勉強します |
+----+--------------------------------------------------------------------------------------------------+
4 rows in set (0.00 sec)
mysql> SELECT * FROM mecab_articles
WHERE MATCH(body) AGAINST("言語"); ⏎
+----+--------------------------------------------------------------------------------------------------+
| id | body |
+----+--------------------------------------------------------------------------------------------------+
| 5 | 勤務先の社内自然言語処理勉強会での発表資料です |
| 6 | この文書は自然言語処理の基本として類似文書推薦について説明します |
| 8 | 自然言語処理の基本を説明します |
| 12 | 複数の言語に対応した software 開発を勉強します |
+----+--------------------------------------------------------------------------------------------------+
4 rows in set (0.00 sec)
mysql>
Ngram のときと同様に「NATURAL LANGUAGE MODE」と「BOOLEAN MODE」の検索モードが利用できます.やはりここでも「自然言語」で検索したときには二つのモードで検索結果に差が現れました.
mysql> SELECT * FROM mecab_articles WHERE MATCH(body) AGAINST("software" IN NATURAL LANGUAGE MODE); ⏎ +----+------------------------------------------------------------------+ | id | body | +----+------------------------------------------------------------------+ | 9 | We consider a software rejuvenation schedule. | | 11 | This model evaluates the quality characteristics of software. | | 12 | 複数の言語に対応した software 開発を勉強します | +----+------------------------------------------------------------------+ 3 rows in set (0.00 sec) mysql> SELECT * FROM mecab_articles WHERE MATCH(body) AGAINST("software" IN BOOLEAN MODE); ⏎ +----+------------------------------------------------------------------+ | id | body | +----+------------------------------------------------------------------+ | 9 | We consider a software rejuvenation schedule. | | 11 | This model evaluates the quality characteristics of software. | | 12 | 複数の言語に対応した software 開発を勉強します | +----+------------------------------------------------------------------+ 3 rows in set (0.00 sec) mysql>
mysql> SELECT * FROM mecab_articles WHERE MATCH(body) AGAINST("晴れ" IN NATURAL LANGUAGE MODE); ⏎ +----+--------------------------------------+ | id | body | +----+--------------------------------------+ | 3 | 明日の天気も晴れでしょう | | 4 | 今日の天気は晴れです | +----+--------------------------------------+ 2 rows in set (0.00 sec) mysql> SELECT * FROM mecab_articles WHERE MATCH(body) AGAINST("晴れ" IN BOOLEAN MODE); ⏎ +----+--------------------------------------+ | id | body | +----+--------------------------------------+ | 3 | 明日の天気も晴れでしょう | | 4 | 今日の天気は晴れです | +----+--------------------------------------+ 2 rows in set (0.00 sec) mysql>
mysql> SELECT * FROM mecab_articles
WHERE MATCH(body)
AGAINST("自然言語" IN NATURAL LANGUAGE MODE); ⏎
+----+--------------------------------------------------------------------------------------------------+
| id | body |
+----+--------------------------------------------------------------------------------------------------+
| 5 | 勤務先の社内自然言語処理勉強会での発表資料です |
| 6 | この文書は自然言語処理の基本として類似文書推薦について説明します |
| 8 | 自然言語処理の基本を説明します |
| 12 | 複数の言語に対応した software 開発を勉強します |
+----+--------------------------------------------------------------------------------------------------+
4 rows in set (0.01 sec)
mysql> SELECT * FROM mecab_articles
WHERE MATCH(body)
AGAINST("自然言語" IN BOOLEAN MODE); ⏎
+----+--------------------------------------------------------------------------------------------------+
| id | body |
+----+--------------------------------------------------------------------------------------------------+
| 5 | 勤務先の社内自然言語処理勉強会での発表資料です |
| 6 | この文書は自然言語処理の基本として類似文書推薦について説明します |
| 8 | 自然言語処理の基本を説明します |
+----+--------------------------------------------------------------------------------------------------+
3 rows in set (0.00 sec)
mysql>
mysql> SELECT * FROM mecab_articles WHERE MATCH(body) AGAINST("言語" IN NATURAL LANGUAGE MODE); ⏎ +----+--------------------------------------------------------------------------------------------------+ | id | body | +----+--------------------------------------------------------------------------------------------------+ | 5 | 勤務先の社内自然言語処理勉強会での発表資料です | | 6 | この文書は自然言語処理の基本として類似文書推薦について説明します | | 8 | 自然言語処理の基本を説明します | | 12 | 複数の言語に対応した software 開発を勉強します | +----+--------------------------------------------------------------------------------------------------+ 4 rows in set (0.00 sec) mysql> SELECT * FROM mecab_articles WHERE MATCH(body) AGAINST("言語" IN BOOLEAN MODE); ⏎ +----+--------------------------------------------------------------------------------------------------+ | id | body | +----+--------------------------------------------------------------------------------------------------+ | 5 | 勤務先の社内自然言語処理勉強会での発表資料です | | 6 | この文書は自然言語処理の基本として類似文書推薦について説明します | | 8 | 自然言語処理の基本を説明します | | 12 | 複数の言語に対応した software 開発を勉強します | +----+--------------------------------------------------------------------------------------------------+ 4 rows in set (0.00 sec) mysql>
Ngram ではできなかった日本語1文字での検索も出来ました.
mysql> SELECT * FROM mecab_articles WHERE MATCH(body) AGAINST("雨" IN NATURAL LANGUAGE MODE); ⏎ +----+-----------------------------------+ | id | body | +----+-----------------------------------+ | 1 | 今日の天気は雨です | | 2 | 明日の天気も雨でしょう | +----+-----------------------------------+ 2 rows in set (0.00 sec) mysql> SELECT * FROM mecab_articles WHERE MATCH(body) AGAINST("雨" IN BOOLEAN MODE); ⏎ +----+-----------------------------------+ | id | body | +----+-----------------------------------+ | 1 | 今日の天気は雨です | | 2 | 明日の天気も雨でしょう | +----+-----------------------------------+ 2 rows in set (0.00 sec) mysql> SELECT * FROM mecab_articles WHERE MATCH(body) AGAINST("は" IN NATURAL LANGUAGE MODE); ⏎ +----+--------------------------------------------------------------------------------------------------+ | id | body | +----+--------------------------------------------------------------------------------------------------+ | 1 | 今日の天気は雨です | | 4 | 今日の天気は晴れです | | 6 | この文書は自然言語処理の基本として類似文書推薦について説明します | | 7 | この資料はジャズのライブについてまとめた資料です | +----+--------------------------------------------------------------------------------------------------+ 4 rows in set (0.00 sec) mysql> SELECT * FROM mecab_articles WHERE MATCH(body) AGAINST("は" IN BOOLEAN MODE); ⏎ +----+--------------------------------------------------------------------------------------------------+ | id | body | +----+--------------------------------------------------------------------------------------------------+ | 1 | 今日の天気は雨です | | 4 | 今日の天気は晴れです | | 6 | この文書は自然言語処理の基本として類似文書推薦について説明します | | 7 | この資料はジャズのライブについてまとめた資料です | +----+--------------------------------------------------------------------------------------------------+ 4 rows in set (0.00 sec) mysql>
アルファベット1文字では検索できませんでした.
mysql> SELECT * FROM mecab_articles WHERE MATCH(body) AGAINST("s" IN NATURAL LANGUAGE MODE); ⏎ Empty set (0.00 sec) mysql> SELECT * FROM mecab_articles WHERE MATCH(body) AGAINST("s" IN BOOLEAN MODE); ⏎ Empty set (0.00 sec)
検索スコアを表示することも可能です.「NATURAL LANGUAGE MODE」では「自然言語」で検索したときに「言語」が検索されましたが,そのレコードのスコアが他と比べて低いことがわかります.
mysql> SELECT id, body,
MATCH(body) AGAINST("自然言語" IN NATURAL LANGUAGE MODE) as score
FROM mecab_articles; ⏎
+----+--------------------------------------------------------------------------------------------------+---------------------+
| id | body | score |
+----+--------------------------------------------------------------------------------------------------+---------------------+
| 1 | 今日の天気は雨です | 0 |
| 2 | 明日の天気も雨でしょう | 0 |
| 3 | 明日の天気も晴れでしょう | 0 |
| 4 | 今日の天気は晴れです | 0 |
| 5 | 勤務先の社内自然言語処理勉強会での発表資料です | 0.5901209115982056 |
| 6 | この文書は自然言語処理の基本として類似文書推薦について説明します | 0.5901209115982056 |
| 7 | この資料はジャズのライブについてまとめた資料です | 0 |
| 8 | 自然言語処理の基本を説明します | 0.5901209115982056 |
| 9 | We consider a software rejuvenation schedule. | 0 |
| 10 | We propose an extended warranty service contract. | 0 |
| 11 | This model evaluates the quality characteristics of software. | 0 |
| 12 | 複数の言語に対応した software 開発を勉強します | 0.22764469683170319 |
+----+--------------------------------------------------------------------------------------------------+---------------------+
12 rows in set (0.00 sec)
mysql> SELECT id, body,
MATCH(body) AGAINST("自然言語" IN BOOLEAN MODE) as score
FROM mecab_articles; ⏎
+----+--------------------------------------------------------------------------------------------------+--------------------+
| id | body | score |
+----+--------------------------------------------------------------------------------------------------+--------------------+
| 1 | 今日の天気は雨です | 0 |
| 2 | 明日の天気も雨でしょう | 0 |
| 3 | 明日の天気も晴れでしょう | 0 |
| 4 | 今日の天気は晴れです | 0 |
| 5 | 勤務先の社内自然言語処理勉強会での発表資料です | 0.5901209115982056 |
| 6 | この文書は自然言語処理の基本として類似文書推薦について説明します | 0.5901209115982056 |
| 7 | この資料はジャズのライブについてまとめた資料です | 0 |
| 8 | 自然言語処理の基本を説明します | 0.5901209115982056 |
| 9 | We consider a software rejuvenation schedule. | 0 |
| 10 | We propose an extended warranty service contract. | 0 |
| 11 | This model evaluates the quality characteristics of software. | 0 |
| 12 | 複数の言語に対応した software 開発を勉強します | 0 |
+----+--------------------------------------------------------------------------------------------------+--------------------+
12 rows in set (0.01 sec)
mysql> EXIT ⏎
Bye
vagrant@ubuntu2204 ~ $
インデックスの詳細情報を確認するために root でログインし,インデックスを確認したいデータベースとテーブルを指定します.
vagrant@ubuntu2204 ~ $ mysql -u root -p ⏎
Enter password: # パスワードを入力(表示されない)
Welcome to the MySQL monitor. Commands end with ; or \g.
Your MySQL connection id is 10
Server version: 8.0.31-0ubuntu0.22.04.1 (Ubuntu)
Copyright (c) 2000, 2022, Oracle and/or its affiliates.
Oracle is a registered trademark of Oracle Corporation and/or its
affiliates. Other names may be trademarks of their respective
owners.
Type 'help;' or '\h' for help. Type '\c' to clear the current input statement.
mysql> SET GLOBAL innodb_ft_aux_table="testDB/mecab_articles"; ⏎
Query OK, 0 rows affected (0.00 sec)
mysql>
information_schema
データベースに移動します.
mysql> SHOW DATABASES; ⏎ +--------------------+ | Database | +--------------------+ | information_schema | | mysql | | performance_schema | | sys | | testDB | +--------------------+ 5 rows in set (0.00 sec) mysql> USE information_schema; ⏎ Reading table information for completion of table and column names You can turn off this feature to get a quicker startup with -A Database changed mysql>
多くのテーブルが定義されていますが,その中の INNODB_FT_INDEX_CACHE
(または INNODB_FT_INDEX_TABLE
)テーブルにインデクスの情報が格納されています.
mysql> SHOW TABLES; ⏎ +---------------------------------------+ | Tables_in_information_schema | +---------------------------------------+ | ADMINISTRABLE_ROLE_AUTHORIZATIONS | | APPLICABLE_ROLES | | CHARACTER_SETS | | CHECK_CONSTRAINTS | | COLLATIONS | | COLLATION_CHARACTER_SET_APPLICABILITY | | COLUMNS | | COLUMNS_EXTENSIONS | | COLUMN_PRIVILEGES | | COLUMN_STATISTICS | | ENABLED_ROLES | | ENGINES | | EVENTS | | FILES | | INNODB_BUFFER_PAGE | | INNODB_BUFFER_PAGE_LRU | | INNODB_BUFFER_POOL_STATS | | INNODB_CACHED_INDEXES | | INNODB_CMP | | INNODB_CMPMEM | | INNODB_CMPMEM_RESET | | INNODB_CMP_PER_INDEX | | INNODB_CMP_PER_INDEX_RESET | | INNODB_CMP_RESET | | INNODB_COLUMNS | | INNODB_DATAFILES | | INNODB_FIELDS | | INNODB_FOREIGN | | INNODB_FOREIGN_COLS | | INNODB_FT_BEING_DELETED | | INNODB_FT_CONFIG | | INNODB_FT_DEFAULT_STOPWORD | | INNODB_FT_DELETED | | INNODB_FT_INDEX_CACHE | | INNODB_FT_INDEX_TABLE | | INNODB_INDEXES | | INNODB_METRICS | | INNODB_SESSION_TEMP_TABLESPACES | | INNODB_TABLES | | INNODB_TABLESPACES | | INNODB_TABLESPACES_BRIEF | | INNODB_TABLESTATS | | INNODB_TEMP_TABLE_INFO | | INNODB_TRX | | INNODB_VIRTUAL | | KEYWORDS | | KEY_COLUMN_USAGE | | OPTIMIZER_TRACE | | PARAMETERS | | PARTITIONS | | PLUGINS | | PROCESSLIST | | PROFILING | | REFERENTIAL_CONSTRAINTS | | RESOURCE_GROUPS | | ROLE_COLUMN_GRANTS | | ROLE_ROUTINE_GRANTS | | ROLE_TABLE_GRANTS | | ROUTINES | | SCHEMATA | | SCHEMATA_EXTENSIONS | | SCHEMA_PRIVILEGES | | STATISTICS | | ST_GEOMETRY_COLUMNS | | ST_SPATIAL_REFERENCE_SYSTEMS | | ST_UNITS_OF_MEASURE | | TABLES | | TABLESPACES | | TABLESPACES_EXTENSIONS | | TABLES_EXTENSIONS | | TABLE_CONSTRAINTS | | TABLE_CONSTRAINTS_EXTENSIONS | | TABLE_PRIVILEGES | | TRIGGERS | | USER_ATTRIBUTES | | USER_PRIVILEGES | | VIEWS | | VIEW_ROUTINE_USAGE | | VIEW_TABLE_USAGE | +---------------------------------------+ 79 rows in set (0.01 sec) mysql>
インデックスを確認します.単語(厳密には形態素)ごとに分割されてインデックス化されていることがわかりました.
mysql> SELECT * FROM INNODB_FT_INDEX_CACHE ORDER BY doc_id, position; ⏎ +-----------------+--------------+-------------+-----------+--------+----------+ | WORD | FIRST_DOC_ID | LAST_DOC_ID | DOC_COUNT | DOC_ID | POSITION | +-----------------+--------------+-------------+-----------+--------+----------+ | 今日 | 2 | 5 | 2 | 2 | 0 | | の | 2 | 13 | 9 | 2 | 6 | | 天気 | 2 | 5 | 4 | 2 | 9 | | は | 2 | 8 | 4 | 2 | 15 | | 雨 | 2 | 3 | 2 | 2 | 18 | | です | 2 | 8 | 4 | 2 | 21 | | 明日 | 3 | 4 | 2 | 3 | 0 | | の | 2 | 13 | 9 | 3 | 6 | | 天気 | 2 | 5 | 4 | 3 | 9 | | も | 3 | 4 | 2 | 3 | 15 | | 雨 | 2 | 3 | 2 | 3 | 18 | | でしょ | 3 | 4 | 2 | 3 | 21 | | う | 3 | 4 | 2 | 3 | 30 | | 明日 | 3 | 4 | 2 | 4 | 0 | | の | 2 | 13 | 9 | 4 | 6 | | 天気 | 2 | 5 | 4 | 4 | 9 | | も | 3 | 4 | 2 | 4 | 15 | | 晴れ | 4 | 5 | 2 | 4 | 18 | | でしょ | 3 | 4 | 2 | 4 | 24 | | う | 3 | 4 | 2 | 4 | 33 | | 今日 | 2 | 5 | 2 | 5 | 0 | | の | 2 | 13 | 9 | 5 | 6 | | 天気 | 2 | 5 | 4 | 5 | 9 | | は | 2 | 8 | 4 | 5 | 15 | | 晴れ | 4 | 5 | 2 | 5 | 18 | | です | 2 | 8 | 4 | 5 | 24 | | 勤務 | 6 | 6 | 1 | 6 | 0 | | 先 | 6 | 6 | 1 | 6 | 6 | | の | 2 | 13 | 9 | 6 | 9 | | 社内 | 6 | 6 | 1 | 6 | 12 | | 自然 | 6 | 9 | 3 | 6 | 18 | | 言語 | 6 | 13 | 4 | 6 | 24 | | 処理 | 6 | 9 | 3 | 6 | 30 | | 勉強 | 6 | 13 | 2 | 6 | 36 | | の | 2 | 13 | 9 | 6 | 39 | | 会 | 6 | 6 | 1 | 6 | 42 | | で | 6 | 6 | 1 | 6 | 45 | | 発表 | 6 | 6 | 1 | 6 | 51 | | 資料 | 6 | 8 | 2 | 6 | 57 | | です | 2 | 8 | 4 | 6 | 63 | | この | 7 | 8 | 2 | 7 | 0 | | 文書 | 7 | 7 | 1 | 7 | 6 | | は | 2 | 8 | 4 | 7 | 12 | | 自然 | 6 | 9 | 3 | 7 | 15 | | 言語 | 6 | 13 | 4 | 7 | 21 | | 処理 | 6 | 9 | 3 | 7 | 27 | | の | 2 | 13 | 9 | 7 | 33 | | 基本 | 7 | 9 | 2 | 7 | 36 | | として | 7 | 7 | 1 | 7 | 42 | | 文書 | 7 | 7 | 1 | 7 | 51 | | 類似 | 7 | 7 | 1 | 7 | 51 | | 推薦 | 7 | 7 | 1 | 7 | 63 | | について | 7 | 8 | 2 | 7 | 69 | | 説明 | 7 | 9 | 2 | 7 | 81 | | し | 7 | 13 | 3 | 7 | 87 | | ます | 7 | 13 | 3 | 7 | 90 | | この | 7 | 8 | 2 | 8 | 0 | | 資料 | 6 | 8 | 2 | 8 | 6 | | は | 2 | 8 | 4 | 8 | 12 | | ジャズ | 8 | 8 | 1 | 8 | 15 | | の | 2 | 13 | 9 | 8 | 24 | | ライブ | 8 | 8 | 1 | 8 | 27 | | について | 7 | 8 | 2 | 8 | 36 | | まとめ | 8 | 8 | 1 | 8 | 48 | | 資料 | 6 | 8 | 2 | 8 | 54 | | た | 8 | 13 | 2 | 8 | 57 | | です | 2 | 8 | 4 | 8 | 66 | | 自然 | 6 | 9 | 3 | 9 | 0 | | 言語 | 6 | 13 | 4 | 9 | 6 | | 処理 | 6 | 9 | 3 | 9 | 12 | | の | 2 | 13 | 9 | 9 | 18 | | 基本 | 7 | 9 | 2 | 9 | 21 | | を | 9 | 13 | 2 | 9 | 27 | | 説明 | 7 | 9 | 2 | 9 | 30 | | し | 7 | 13 | 3 | 9 | 36 | | ます | 7 | 13 | 3 | 9 | 39 | | we | 10 | 11 | 2 | 10 | 0 | | consider | 10 | 10 | 1 | 10 | 2 | | software | 10 | 13 | 3 | 10 | 13 | | rejuvenation | 10 | 10 | 1 | 10 | 22 | | schedule | 10 | 10 | 1 | 10 | 35 | | . | 10 | 12 | 3 | 10 | 44 | | we | 10 | 11 | 2 | 11 | 0 | | propose | 11 | 11 | 1 | 11 | 2 | | extended | 11 | 11 | 1 | 11 | 13 | | warranty | 11 | 11 | 1 | 11 | 22 | | service | 11 | 11 | 1 | 11 | 31 | | contract | 11 | 11 | 1 | 11 | 39 | | . | 10 | 12 | 3 | 11 | 48 | | model | 12 | 12 | 1 | 12 | 4 | | evaluates | 12 | 12 | 1 | 12 | 10 | | quality | 12 | 12 | 1 | 12 | 24 | | characteristics | 12 | 12 | 1 | 12 | 32 | | software | 10 | 13 | 3 | 12 | 51 | | . | 10 | 12 | 3 | 12 | 60 | | 複数 | 13 | 13 | 1 | 13 | 0 | | の | 2 | 13 | 9 | 13 | 6 | | 言語 | 6 | 13 | 4 | 13 | 9 | | に | 13 | 13 | 1 | 13 | 15 | | 対応 | 13 | 13 | 1 | 13 | 18 | | し | 7 | 13 | 3 | 13 | 24 | | た | 8 | 13 | 2 | 13 | 27 | | software | 10 | 13 | 3 | 13 | 30 | | し | 7 | 13 | 3 | 13 | 31 | | 開発 | 13 | 13 | 1 | 13 | 39 | | を | 9 | 13 | 2 | 13 | 46 | | 勉強 | 6 | 13 | 2 | 13 | 49 | | ます | 7 | 13 | 3 | 13 | 58 | +-----------------+--------------+-------------+-----------+--------+----------+ 108 rows in set (0.00 sec) mysql> EXIT ⏎ Bye vagrant@ubuntu2204 ~ $