フリーワード検索をしたい
指定した全カラムからワードをあいまい検索する方法。
まずは今のソース
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 カラム名
でカラムを追加できる。
実施したコードは以下となった。
alter table search_info add FULLTEXT(team_name,sport_name,prefectures,activity_frequency,day_of_the_week,team_concept) WITH PARSER ngram
結果、FULLTEXT が追加されている↓
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文字が必要になっていた為、それに合わせた。
「んな」というワードを検索してみる。
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カラムの「んなもんねえ!」が一致し引っ掛かった。
思ったより簡単過ぎた。。