仮想開発環境の構築トップページ


MySQL を使う

ここの手順で Ubuntu の設定をすると MySQL データベース管理システムがインストールされています.このページでは MySQL を使った検索方法などを確認しよう.

目次

  1. データベース操作の基本
  2. Ngram インデックス
  3. MeCab インデックス
  4. mecab-ipadic-NEologd を使った MeCab インデックス
  5. 他のホストからの接続

mecab-ipadic-NEologd を使った MeCab インデックス

ここでは MeCab の拡張辞書である mecab-ipadic-NEologd を使って MySQL のフルテキストインデックを作成する方法について説明します.すでにここの手順に従って MeCab がインストールされ,ここの手順に従って MeCab のインデックスを使った MySQL の全文検索ができているものとします.また,ここで実行しているような方法で mecab-ipadic-NEologd を使った形態素解析が動作することを確認しておいてください.

MeCab の設定

MeCab の辞書を変更するために,vi エディタなどで /etc/mysql/mecabrc ファイルを編集します.

vagrant@ubuntu2204 ~ $ cd /etc/mysql/ ⏎
vagrant@ubuntu2204 mysql $ sudo vi mecabrc ⏎
/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

編集できたら MySQL を再起動します.

vagrant@ubuntu2204 mysql $ sudo systemctl restart mysql ⏎
vagrant@ubuntu2204 mysql $ 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:41:15 JST; 6s ago
    Process: 14271 ExecStartPre=/usr/share/mysql/mysql-systemd-start pre (code=exited, status=0/SUCCESS)
   Main PID: 14279 (mysqld)
     Status: "Server is operational"
      Tasks: 39 (limit: 2236)
     Memory: 367.1M
        CPU: 723ms
     CGroup: /system.slice/mysql.service
             └─14279 /usr/sbin/mysqld

10月 27 12:41:14 ubuntu2204.localdomain systemd[1]: Stopped MySQL Community Server.
10月 27 12:41:14 ubuntu2204.localdomain systemd[1]: mysql.service: Consumed 12.218s CPU time.
10月 27 12:41:14 ubuntu2204.localdomain systemd[1]: Starting MySQL Community Server...
10月 27 12:41:15 ubuntu2204.localdomain systemd[1]: Started MySQL Community Server.
vagrant@ubuntu2204 mysql $

目次に戻る

テーブルの作成とインデックス指定

MySQL に dbuser でログインし,testDB データベースに移動します.

vagrant@ubuntu2204 mysql $ mysql -u dbuser -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> 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 neo_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.10 sec)

mysql>

テーブルの詳細を確認します.

mysql> DESC neo_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 neo_articles\G ⏎
*************************** 1. row ***************************
       Table: neo_articles
Create Table: CREATE TABLE `neo_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 neo_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.34 sec)
Records: 12  Duplicates: 0  Warnings: 0

mysql>

データを確認します.

mysql> SELECT * FROM neo_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 インデックスを使った全文検索

検索モードを指定せず(つまり「NATURAL LANGUAGE MODE」で)全文検索を行います.「自然言語」で検索したときに一切検索されませんでした.また,「言語」では1件しかヒットしませんでした.(この理由はインデックスの詳細を確認すると理解できます.)

mysql> SELECT * FROM neo_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 neo_articles
    WHERE MATCH(body) AGAINST("晴れ"); ⏎
+----+--------------------------------------+
| id | body                                 |
+----+--------------------------------------+
|  3 | 明日の天気も晴れでしょう             |
|  4 | 今日の天気は晴れです                 |
+----+--------------------------------------+
2 rows in set (0.00 sec)

mysql> SELECT * FROM neo_articles
    WHERE MATCH(body) AGAINST("自然言語"); ⏎
Empty set (0.00 sec)

mysql> SELECT * FROM neo_articles
    WHERE MATCH(body) AGAINST("言語"); ⏎
+----+------------------------------------------------------------------+
| id | body                                                             |
+----+------------------------------------------------------------------+
| 12 | 複数の言語に対応した software 開発を勉強します                   |
+----+------------------------------------------------------------------+
1 row in set (0.00 sec)

mysql>

目次に戻る

全文検索のモード

これまで同様,全文検索のモードは「NATURAL LANGUAGE MODE」と「BOOLEAN MODE」が利用できます.しかし今回の例では結果に差は現れませんでした.

mysql> SELECT * FROM neo_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 neo_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 neo_articles
    WHERE MATCH(body)
    AGAINST("晴れ" IN NATURAL LANGUAGE MODE); ⏎
+----+--------------------------------------+
| id | body                                 |
+----+--------------------------------------+
|  3 | 明日の天気も晴れでしょう             |
|  4 | 今日の天気は晴れです                 |
+----+--------------------------------------+
2 rows in set (0.00 sec)

mysql> SELECT * FROM neo_articles
    WHERE MATCH(body)
    AGAINST("晴れ" IN BOOLEAN MODE); ⏎
+----+--------------------------------------+
| id | body                                 |
+----+--------------------------------------+
|  3 | 明日の天気も晴れでしょう             |
|  4 | 今日の天気は晴れです                 |
+----+--------------------------------------+
2 rows in set (0.00 sec)

mysql>

mysql> SELECT * FROM neo_articles
    WHERE MATCH(body)
    AGAINST("自然言語" IN NATURAL LANGUAGE MODE); ⏎
Empty set (0.00 sec)

mysql> SELECT * FROM neo_articles
    WHERE MATCH(body)
    AGAINST("自然言語" IN BOOLEAN MODE); ⏎
Empty set (0.00 sec)

mysql>

mysql> SELECT * FROM neo_articles
    WHERE MATCH(body)
    AGAINST("言語" IN NATURAL LANGUAGE MODE); ⏎
+----+------------------------------------------------------------------+
| id | body                                                             |
+----+------------------------------------------------------------------+
| 12 | 複数の言語に対応した software 開発を勉強します                   |
+----+------------------------------------------------------------------+
1 row in set (0.00 sec)

mysql> SELECT * FROM neo_articles
  WHERE MATCH(body)
  AGAINST("言語" IN BOOLEAN MODE); ⏎
+----+------------------------------------------------------------------+
| id | body                                                             |
+----+------------------------------------------------------------------+
| 12 | 複数の言語に対応した software 開発を勉強します                   |
+----+------------------------------------------------------------------+
1 row in set (0.00 sec)

mysql>

目次に戻る

1文字での検索

日本語1文字での検索も可能でした.

mysql> SELECT * FROM neo_articles
    WHERE MATCH(body)
    AGAINST("雨" IN NATURAL LANGUAGE MODE); ⏎
+----+-----------------------------------+
| id | body                              |
+----+-----------------------------------+
|  1 | 今日の天気は雨です                |
|  2 | 明日の天気も雨でしょう            |
+----+-----------------------------------+
2 rows in set (0.00 sec)

mysql> SELECT * FROM neo_articles
    WHERE MATCH(body)
    AGAINST("雨" IN BOOLEAN MODE); ⏎
+----+-----------------------------------+
| id | body                              |
+----+-----------------------------------+
|  1 | 今日の天気は雨です                |
|  2 | 明日の天気も雨でしょう            |
+----+-----------------------------------+
2 rows in set (0.00 sec)

mysql>

mysql> SELECT * FROM neo_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 neo_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 neo_articles
    WHERE MATCH(body)
    AGAINST("s" IN NATURAL LANGUAGE MODE); ⏎
Empty set (0.00 sec)

mysql> SELECT * FROM neo_articles
    WHERE MATCH(body)
    AGAINST("s" IN BOOLEAN MODE); ⏎
Empty set (0.00 sec)

mysql>

目次に戻る

検索スコアの表示

検索スコアを表示することも可能です.

mysql> SELECT id, body,
    MATCH(body) AGAINST("自然言語" IN NATURAL LANGUAGE MODE) as score
    FROM neo_articles; ⏎
+----+--------------------------------------------------------------------------------------------------+-------+
| id | body                                                                                             | score |
+----+--------------------------------------------------------------------------------------------------+-------+
|  1 | 今日の天気は雨です                                                                               |     0 |
|  2 | 明日の天気も雨でしょう                                                                           |     0 |
|  3 | 明日の天気も晴れでしょう                                                                         |     0 |
|  4 | 今日の天気は晴れです                                                                             |     0 |
|  5 | 勤務先の社内自然言語処理勉強会での発表資料です                                                   |     0 |
|  6 | この文書は自然言語処理の基本として類似文書推薦について説明します                                 |     0 |
|  7 | この資料はジャズのライブについてまとめた資料です                                                 |     0 |
|  8 | 自然言語処理の基本を説明します                                                                   |     0 |
|  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.00 sec)

mysql> SELECT id, body,
    MATCH(body) AGAINST("自然言語" IN BOOLEAN MODE) as score
    FROM neo_articles; ⏎
+----+--------------------------------------------------------------------------------------------------+-------+
| id | body                                                                                             | score |
+----+--------------------------------------------------------------------------------------------------+-------+
|  1 | 今日の天気は雨です                                                                               |     0 |
|  2 | 明日の天気も雨でしょう                                                                           |     0 |
|  3 | 明日の天気も晴れでしょう                                                                         |     0 |
|  4 | 今日の天気は晴れです                                                                             |     0 |
|  5 | 勤務先の社内自然言語処理勉強会での発表資料です                                                   |     0 |
|  6 | この文書は自然言語処理の基本として類似文書推薦について説明します                                 |     0 |
|  7 | この資料はジャズのライブについてまとめた資料です                                                 |     0 |
|  8 | 自然言語処理の基本を説明します                                                                   |     0 |
|  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.00 sec)

mysql>

mysql> SELECT id, body,
    MATCH(body) AGAINST("言語" IN NATURAL LANGUAGE MODE) as score
    FROM neo_articles; ⏎
+----+--------------------------------------------------------------------------------------------------+--------------------+
| id | body                                                                                             | score              |
+----+--------------------------------------------------------------------------------------------------+--------------------+
|  1 | 今日の天気は雨です                                                                               |                  0 |
|  2 | 明日の天気も雨でしょう                                                                           |                  0 |
|  3 | 明日の天気も晴れでしょう                                                                         |                  0 |
|  4 | 今日の天気は晴れです                                                                             |                  0 |
|  5 | 勤務先の社内自然言語処理勉強会での発表資料です                                                   |                  0 |
|  6 | この文書は自然言語処理の基本として類似文書推薦について説明します                                 |                  0 |
|  7 | この資料はジャズのライブについてまとめた資料です                                                 |                  0 |
|  8 | 自然言語処理の基本を説明します                                                                   |                  0 |
|  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 開発を勉強します                                                   | 1.1646322011947632 |
+----+--------------------------------------------------------------------------------------------------+--------------------+
12 rows in set (0.00 sec)

mysql> SELECT id, body,
    MATCH(body) AGAINST("言語" IN BOOLEAN MODE) as score
    FROM neo_articles; ⏎
+----+--------------------------------------------------------------------------------------------------+--------------------+
| id | body                                                                                             | score              |
+----+--------------------------------------------------------------------------------------------------+--------------------+
|  1 | 今日の天気は雨です                                                                               |                  0 |
|  2 | 明日の天気も雨でしょう                                                                           |                  0 |
|  3 | 明日の天気も晴れでしょう                                                                         |                  0 |
|  4 | 今日の天気は晴れです                                                                             |                  0 |
|  5 | 勤務先の社内自然言語処理勉強会での発表資料です                                                   |                  0 |
|  6 | この文書は自然言語処理の基本として類似文書推薦について説明します                                 |                  0 |
|  7 | この資料はジャズのライブについてまとめた資料です                                                 |                  0 |
|  8 | 自然言語処理の基本を説明します                                                                   |                  0 |
|  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 開発を勉強します                                                   | 1.1646322011947632 |
+----+--------------------------------------------------------------------------------------------------+--------------------+
12 rows in set (0.00 sec)

mysql> EXIT ⏎
Bye
vagrant@ubuntu2204 mysql $

目次に戻る

インデックス詳細情報の確認

インデックスの詳細情報を確認するために root ユーザで MySQL にログインします.また,確認したいデータベース名とテーブル名を指定します.

vagrant@ubuntu2204 mysql $ 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/neo_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.00 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 |           8 |         4 |      2 |       15 |
| 雨                 |            2 |           3 |         2 |      2 |       18 |
| です               |            2 |           8 |         4 |      2 |       21 |
| 明日の天気         |            3 |           4 |         2 |      3 |        0 |
| も                 |            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 |
| も                 |            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 |           8 |         4 |      5 |       15 |
| 晴れ               |            4 |           5 |         2 |      5 |       18 |
| です               |            2 |           8 |         4 |      5 |       24 |
| 勤務先             |            6 |           6 |         1 |      6 |        0 |
| の                 |            6 |          13 |         5 |      6 |        9 |
| 社内               |            6 |           6 |         1 |      6 |       12 |
| 自然言語処理       |            6 |           9 |         3 |      6 |       18 |
| 勉強会             |            6 |           6 |         1 |      6 |       36 |
| の                 |            6 |          13 |         5 |      6 |       39 |
| で                 |            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 |         5 |      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 |
| の                 |            6 |          13 |         5 |      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 |         5 |      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 |
| の                 |            6 |          13 |         5 |     13 |        6 |
| 言語               |           13 |          13 |         1 |     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 |
| 勉強               |           13 |          13 |         1 |     13 |       49 |
| ます               |            7 |          13 |         3 |     13 |       58 |
+--------------------+--------------+-------------+-----------+--------+----------+
92 rows in set (0.00 sec)

mysql> EXIT ⏎
Bye
vagrant@ubuntu2204 mysql $

目次に戻る

3つのインデックス検索結果の比較

実際に Ngram,MeCab 標準辞書,mecab-ipadic-NEologd の3種類のインデックスを利用して検索ワード「今日」を検索し,mecab-ipadic-NEologd ではヒットしないことを確認しよう.

vagrant@ubuntu2204 mysql $ mysql -u dbuser -p ⏎
Enter password: # パスワードを入力(表示されない)
Welcome to the MySQL monitor.  Commands end with ; or \g.
Your MySQL connection id is 12
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> SELECT * FROM articles
    WHERE MATCH(body) AGAINST("今日"); ⏎
+----+--------------------------------+
| id | body                           |
+----+--------------------------------+
|  1 | 今日の天気は雨です             |
|  4 | 今日の天気は晴れです           |
+----+--------------------------------+
2 rows in set (0.00 sec)

mysql> SELECT * FROM mecab_articles
    WHERE MATCH(body) AGAINST("今日"); ⏎
+----+--------------------------------+
| id | body                           |
+----+--------------------------------+
|  1 | 今日の天気は雨です             |
|  4 | 今日の天気は晴れです           |
+----+--------------------------------+
2 rows in set (0.00 sec)

mysql> SELECT * FROM neo_articles
    WHERE MATCH(body) AGAINST("今日"); ⏎
Empty set (0.00 sec)

mysql> EXIT ⏎
Bye
vagrant@ubuntu2204 mysql $

目次に戻る

標準辞書に戻す設定変更

MySQL で利用する MeCab 用の辞書を標準辞書に戻す方法も残しておきます.設定ファイルの編集後に MySQL を再起動するだけで良いでしょう.

/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
vagrant@ubuntu2204 mysql $ sudo systemctl restart mysql ⏎
vagrant@ubuntu2204 mysql $

目次に戻る