HerokuとPHPでLineのDB接続されたチャットボットを作る5(曖昧検索)
前回:
1. 簡単なBotの作成(おうむ返し)
2. データベース接続(準備)
3.データベース接続(接続)
4. 検索・返信処理
5. 曖昧検索
とりあえず一旦のラスト(まだ続きはします)。
とりあえず曖昧検索どうしたらできるかなって考えた時に、想定される言葉全部登録しといてそこに一致するのあるかで判別すればいいんじゃない?って思いついた。
もはや同意語検索みたいなもんだけど一旦置いとく。
なかなか荒技なので、精度はそんなに高くなさそうだけど、目的は達成されるので実装する。(精度の向上は次回以降、もし書けたら。)
検索用データの登録
まずは検索用のデータを登録する。
Workbenchから、前回まで同様テーブルにアクセス。
そこからId, name, addressに加えてsearchという列を追加する。
ここには、レストランの名前の正式名称含めて想定される変化形(マクドナルドだったらマクド、マックなど)をカンマ区切りで入力する。
例 : マクドナルド,マック,マクド,mac,まっく
こうすることで、ユーザーが「マック」と入力した際に、部分一致検索でこのデータが引っかかり、判定できるようになる。
SQL文の編集
次にSQL文の編集をする。
変わるところは
1. 検索先の変更
2. 完全一致じゃなくするため likeを使う
$sql = $dbh->prepare("SELECT * FROM test_table WHERE search like :name ");
ただ、検索を部分一致にするためにはlikeの対象を%で挟まなくてはいけないので、bindValueの方で対応する。
$sql->bindValue(':name', "%{$res_name}%");
こうすることで、実行時に実質 like %$res_name%となり、部分一致での検索が可能になる。
そこらへんのコード:
$sql = $dbh->prepare("SELECT * FROM test_table WHERE search = :name");
$sql->bindValue(':name', "%{$res_name}%");
$sql->execute();
$result = $sql->fetch();
これであとは配列になってる$resultから好きな値をとって返信に入れるだけ。
配列のkeyはprint_r($result)を返信のところに入れれば、配列の中身がみれるから、そこから確認。
短くなったけどそんな感じ。
これで当初の目標は達成したので、一旦締め。