facebook twitter hatena line email

「Mysql/日本語全文検索」の版間の差分

提供: 初心者エンジニアの簡易メモ
移動: 案内検索
 
(同じ利用者による、間の3版が非表示)
行8: 行8:
 
それまでは以下mroongaでしか使えなかった。
 
それまでは以下mroongaでしか使えなかった。
  
==ngram2での検索サンプル==
+
==ngram2==
 +
問題点:1文字検索がhitしない。
 +
===ngram2での検索サンプル===
 
  CREATE TABLE diaries (
 
  CREATE TABLE diaries (
 
   id INT UNSIGNED AUTO_INCREMENT NOT NULL PRIMARY KEY,
 
   id INT UNSIGNED AUTO_INCREMENT NOT NULL PRIMARY KEY,
行18: 行20:
 
  SELECT * FROM diaries WHERE MATCH(content) AGAINST('+晴れ' IN BOOLEAN MODE);
 
  SELECT * FROM diaries WHERE MATCH(content) AGAINST('+晴れ' IN BOOLEAN MODE);
  
==ngram2での検索サンプル(複数カラムの検索の場合)==
+
===ngram2での検索サンプル(複数カラムの検索の場合)===
 
  CREATE TABLE diaries (
 
  CREATE TABLE diaries (
 
   id INT PRIMARY KEY AUTO_INCREMENT,
 
   id INT PRIMARY KEY AUTO_INCREMENT,
行31: 行33:
 
  SELECT * FROM diaries WHERE MATCH(fulltext_column) against('+曇!' IN BOOLEAN MODE);
 
  SELECT * FROM diaries WHERE MATCH(fulltext_column) against('+曇!' IN BOOLEAN MODE);
  
==mecabを使う==
+
==mecab==
 +
mysql8で使えるかは微妙
 +
===mecabを使う===
 
  $ vi /etc/my.cnf
 
  $ vi /etc/my.cnf
 
  [mysqld]
 
  [mysqld]
行42: 行46:
 
  | mecab                      | ACTIVE  | FTPARSER          | libpluginmecab.so | GPL
 
  | mecab                      | ACTIVE  | FTPARSER          | libpluginmecab.so | GPL
  
==mecab検索==
+
===mecab検索===
 
  CREATE TABLE diaries_mecab
 
  CREATE TABLE diaries_mecab
 
  (
 
  (
 
   id INT UNSIGNED AUTO_INCREMENT NOT NULL PRIMARY KEY,
 
   id INT UNSIGNED AUTO_INCREMENT NOT NULL PRIMARY KEY,
   content VARCHAR(255),
+
   content TEXT,
 
   FULLTEXT INDEX mecab_idx (content) WITH PARSER mecab
 
   FULLTEXT INDEX mecab_idx (content) WITH PARSER mecab
 
  ) ENGINE=InnoDB CHARACTER SET utf8mb4;
 
  ) ENGINE=InnoDB CHARACTER SET utf8mb4;

2026年4月19日 (日) 04:23時点における最新版

mysql5.7から日本語全文検索にも対応された

初期設定なしで、ngram2であれば使える。 mecabを入れれば分かち書きが使えるようになる。

mysql5.6までは

Mroonga [ショートカット]

それまでは以下mroongaでしか使えなかった。

ngram2

問題点:1文字検索がhitしない。

ngram2での検索サンプル

CREATE TABLE diaries (
 id INT UNSIGNED AUTO_INCREMENT NOT NULL PRIMARY KEY,
 content Text,
 FULLTEXT INDEX ftx_fulltext(content) WITH PARSER `ngram`
) ENGINE=InnoDB CHARACTER SET utf8mb4;
insert into diaries (content) values ("明日は晴れです");
insert into diaries (content) values ("明日は曇りです");
SELECT * FROM diaries WHERE MATCH(content) AGAINST('+晴れ' IN BOOLEAN MODE);

ngram2での検索サンプル(複数カラムの検索の場合)

CREATE TABLE diaries (
 id INT PRIMARY KEY AUTO_INCREMENT,
   title VARCHAR(64) NULL DEFAULT NULL,
   content TEXT NULL,
   fulltext_column TEXT AS (CONCAT(title, ' ', content)) STORED,
   FULLTEXT INDEX ftx_fulltext (fulltext_column) WITH PARSER `ngram`
) ENGINE=InnoDB CHARACTER SET utf8mb4;
insert into diaries (title,content) values ("晴!", "明日は晴れです");
insert into diaries (title,content) values ("曇!", "明日は曇りです");
SELECT * FROM diaries WHERE MATCH(fulltext_column) against('+晴れ' IN BOOLEAN MODE);
SELECT * FROM diaries WHERE MATCH(fulltext_column) against('+曇!' IN BOOLEAN MODE);

mecab

mysql8で使えるかは微妙

mecabを使う

$ vi /etc/my.cnf
[mysqld]
loose-mecab-rc-file=/etc/mecabrc
innodb_ft_min_token_size=2
$ sudo /etc/rc.d/init.d/mysqld restart
mysql> INSTALL PLUGIN mecab SONAME 'libpluginmecab.so';
mysql> SHOW PLUGINS;
| Name                       | Status   | Type               | Library           | License
| mecab                      | ACTIVE   | FTPARSER           | libpluginmecab.so | GPL

mecab検索

CREATE TABLE diaries_mecab
(
 id INT UNSIGNED AUTO_INCREMENT NOT NULL PRIMARY KEY,
 content TEXT,
 FULLTEXT INDEX mecab_idx (content) WITH PARSER mecab
) ENGINE=InnoDB CHARACTER SET utf8mb4;
insert into diaries_mecab (content) values ("明日は晴れです");
insert into diaries_mecab (content) values ("明日は曇りです");
select * from diaries_mecab where match(content) against('晴れ');

参考

http://mysqlserverteam.com/innodb-%E5%85%A8%E6%96%87%E6%A4%9C%E7%B4%A2-mecab-parser/