それマグで!

知識はカップより、マグでゆっくり頂きます。 takuya_1stのブログ

習慣に早くから配慮した者は、 おそらく人生の実りも大きい。

MySQLの全文検索を日本語対応にする/Mattermostの日本語検索ができない問題に対応

現れた問題点

Mattermostの日本語検索ができない

MattermostはMYSQL全文検索を使っている

MYSQL全文検索について設定する

N-gram(2-gram) で検索されない

ASANAみたいな単語は、AS-SA-AN-NA に分割されてN-gram(bi-gram)になって、MYSQLAS / AN がストップワードなので、検索されなくなります。

そこで、ngramを小さくした上で、ストップワードをオフにします。 そもそも、日本語では、英単語を単なる熟語として採用しているだけであり、検索キーワードそのものです。ストップワードする意味がありません。

/etc/mysql/mysql.conf.d/mysqld.cnf

## 2022-11-14 takuya
## https://dev.mysql.com/doc/refman/5.6/ja/fulltext-fine-tuning.html
[mysqld]
innodb_ft_min_token_size=2
ft_min_word_len=2
innodb_ft_enable_stopword=OFF

ubuntu でのファイルの場所

ubuntu では mariadb / mysql の互換性を考えていっぱいファイルが有るのですが。mysqld.conf に設置するのが基本らしい

takuya@Gitlab:~$ sudo tree /etc/mysql
/etc/mysql
├── conf.d
│   ├── mysql.cnf
│   └── mysqldump.cnf
├── debian-start
├── debian.cnf
├── my.cnf -> /etc/alternatives/my.cnf
├── my.cnf.fallback
├── mysql.cnf
└── mysql.conf.d
    ├── mysql.cnf
    └── mysqld.cnf

2 directories, 9 files

再起動で mysqld.conf を反映

sudo systemctl restart mysql

再起動後の設定反映の確認

$ sudo mysql;
mysql > SHOW VARIABLES LIKE 'innodb_ft_enable_stopword';
+---------------------------+-------+
| Variable_name             | Value |
+---------------------------+-------+
| innodb_ft_enable_stopword | OFF   |
+---------------------------+-------+
1 row in set (0.05 sec)

設定をインデックスに反映する。

インデックスを再構築するのだが、innno_db においては、OPTIMIZE table すればいい

インデックスの再構築

$ sudo mysql;
mysql > use mattermost_production_db;
mysql > OPTIMIZE TABLE Posts;

インデックスの再構築は少し時間が必要なので注意。