4
2

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?

More than 3 years have passed since last update.

My SQLでフリーワード検索をしたい

Last updated at Posted at 2020-07-23

フリーワード検索をしたい

指定した全カラムからワードをあいまい検索する方法。

まずは今のソース

.sql
CREATE TABLE `search_info` (
  `id` int(50) NOT NULL AUTO_INCREMENT COMMENT 'id',
  `team_name` varchar(80) NOT NULL DEFAULT '' COMMENT 'チーム名',
  `picture` blob COMMENT 'チーム写真',
  `sport_name` varchar(25) DEFAULT NULL COMMENT '競技名',
  `prefectures` varchar(255) DEFAULT NULL COMMENT '活動地域',
  `activity_frequency` varchar(30) DEFAULT NULL COMMENT '活動頻度',
  `day_of_the_week` varchar(21) DEFAULT NULL COMMENT '活動曜日',
  `team_concept` varchar(400) DEFAULT NULL COMMENT 'チームコンセプト',
  PRIMARY KEY (`id`)
) ENGINE=InnoDB AUTO_INCREMENT=28 DEFAULT CHARSET=utf8

検索準備

検索対象にしたいカラムをFULLTEXTというカラムに追加する。
今回ngramという検索方法を用いるのでWITH PARSER ngramを追加。
つまり、FULLTEXT(カラム名) WITH PARSER ngramとなる。

alter table テーブル名 add カラム名でカラムを追加できる。

実施したコードは以下となった。

.sql
alter table search_info add FULLTEXT(team_name,sport_name,prefectures,activity_frequency,day_of_the_week,team_concept) WITH PARSER ngram

結果、FULLTEXT が追加されている↓

.sql
CREATE TABLE `search_info` (
  `id` int(50) NOT NULL AUTO_INCREMENT COMMENT 'id',
  `team_name` varchar(80) NOT NULL DEFAULT '' COMMENT 'チーム名',
  `picture` blob COMMENT 'チーム写真',
  `sport_name` varchar(25) DEFAULT NULL COMMENT '競技名',
  `prefectures` varchar(255) DEFAULT NULL COMMENT '活動地域',
  `activity_frequency` varchar(30) DEFAULT NULL COMMENT '活動頻度',
  `day_of_the_week` varchar(21) DEFAULT NULL COMMENT '活動曜日',
  `team_concept` varchar(400) DEFAULT NULL COMMENT 'チームコンセプト',
  PRIMARY KEY (`id`),
  FULLTEXT KEY `team_name` (`team_name`,`sport_name`,`prefectures`,`activity_frequency`,`day_of_the_week`,`team_concept`) /*!50100 WITH PARSER `ngram` */ 
) ENGINE=InnoDB AUTO_INCREMENT=28 DEFAULT CHARSET=utf8

検索方法

MATCH (カラム,カラム,...) AGAINST (ワード [検索モード])
検索モードが何種類かあり、今回は完全一致のIN BOOLEAN MODEを使用する。
(他のあいまい検索、関連度順検索等はページ最下部の参考記事から)

使用してる検索方法「ngram」はデフォで2文字ずつ文字を切り分けているので、
最低2文字のワードが必要。

※変更するには「ngram_token_size=数宇」を設定。
(この値の変更には、SQLインスタンスの再起動が必要。
また、インデックスの再作成も必要。
テーブル、カラム単位で設定は行えない。)
1文字の方が良くないか・・とも考えたが、
メモリの使用量が増える等のデメリットもあり、
実際に、LINEのメッセージやオープンチャット検索でも
最低2文字が必要になっていた為、それに合わせた。
image.png

「んな」というワードを検索してみる。

.sql
SELECT * FROM search_info WHERE MATCH (team_name,sport_name,prefectures,activity_frequency,day_of_the_week,team_concept) AGAINST ('んな' IN BOOLEAN MODE)

team_conceptカラムの「んなもんねえ!」が一致し引っ掛かった。
思ったより簡単過ぎた。。
image.png

参考記事

MySQLのN-gramを使った全文検索

4
2
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
4
2

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?