ひとつは、揺らぎ検索です。
今の手段としては、キーワード入力画面でPOSTされた$search_keyを、
$search_key_a = mb_convert_kana($search_key, "a");
$search_key_aa = mb_convert_kana($search_key, "A");・・・・
と『k,KV,h,HV,c,C』まで8つの変数に格納し、SQLのWHERE句で『s.title like '%$search_key_a%'』とし全てOR条件で8回繰り返し聞いています。
検索するフィールドが1つならいいですが、多数に及ぶとWHERE句での条件指定も増えてしまいます。レコードが増えると付加が心配です。
この方法以外に効率的な方法をご存知の方はいませんか?
二つ目が、サーチキーが半角もしくは全角スペースで区切られた場合、AND条件で検索するというやり方ですが、こちらの方法はさっぱりわかりません。
ざっくりした流れと、関数はどのようなものを使うなど教えてください。
よろしくお願いします。
1つ目は検索用に別カラムを設定する事をオススメします。
そちらではたとえば数字は半角かなは全角と言うようにルールを決めて格納しておき、揺らぎ自体を排除する。
検索キーワードにも同じ処理を施してから検索にかければほぼ1回で済むはず。
また、
s.title like '%$search_key_a%'
この構文はインデックスが使用出来ないので非常に効率が悪い。
全文検索と併用するのがよいと思われる。
MySQL AB :: MySQL 4.1 リファレンスマニュアル :: 6.8 MySQL 全文検索
ただし標準では日本語に対応していないのでこういった小細工が必要。
MySQL FULLTEXT + Ngram : LIKE検索より数十倍高速な、お手軽 日本語全文検索 について|blog|たたみラボ
2つ目は split 関数などでセパレーター文字列で分割する。
その上で 'AND' を使用した SQL 文を自分で再度組み立てる事になります。
> 1つ目は検索用に別カラムを設定する事をオススメします。
やっと意味を理解しました。
サイトでキーワード再表示用の変数と、検索用の変数を2つ持つということですね。
住所フィールドも検索対称にしていたので、住所の番地は全角で格納したかったんですが(テキスト文のフィールドは数字が続く可能性があるので半角格納としていました。)、統一するなら半角でしかたないですね。
だいぶ条件は減りましたが、
$search_key_c = mb_convert_kana($search_key, "c");と"C"だけは、今の私では回避法が思いつかずしょう無し検索条件に入れています。
> 全文検索と併用するのがよいと思われる。
これは私にとって非常にハードル高そうです。がんばってみます。
2つめはsplit 関数という手がかりが出来たので何とかなるかもしれません。
ありがとうございました。