質問編集履歴
1
見づらかったので改行を調整しました
title
CHANGED
File without changes
|
body
CHANGED
@@ -19,18 +19,22 @@
|
|
19
19
|
①まず全件SELECTして、PHP側でsimilar_text関数やlevenstein関数を使って重みづけ・ソート
|
20
20
|
→件数によってはSELECT時にPHPがメモリオーバーを起こす恐れがあるため、
|
21
21
|
何らかの条件である程度絞ってSELECTするという妥協もあり
|
22
|
+
|
22
23
|
②完全一致でSELECT、8文字程度の前方一致でSELECT…と
|
23
24
|
少しずつ条件を緩和しつつ何度かSELECTし、10件以上抽出できた時点で終了
|
24
25
|
→PHPから何度もSQL実行するのはオーバーヘッドが大きくなるためできれば避けたいが、
|
25
26
|
遅い複雑なSQLよりはマシかもしれない…
|
27
|
+
|
26
28
|
③MySQLのストアドプロシージャでPHPのlevenstein関数のようなものを作る
|
27
29
|
→他の方が試していたので実は詳細を把握していないのですが、
|
28
30
|
1万件から検索するのに15秒ほどかかっていました。
|
31
|
+
|
29
32
|
④abcd→「a ab bc cd d」のように分割した文字列を格納するフィールドを別途用意して
|
30
33
|
FULLTEXTインデックスを張り、MATCH~AGAINST構文でSELECT
|
31
34
|
→インデックスの制約に引っかかってうまく検索できない
|
32
35
|
(50%以上のレコードに含まれている単語は無視される)
|
33
36
|
MySQLのソースを書き換えれば動くようだが、同じサーバで稼働中のサイトもあり、極力避けたい
|
37
|
+
|
34
38
|
⑤2文字程度までの不一致は許可するとして、検索する文字列が「abcdefghij」とすると、
|
35
39
|
「%cdefghij%」「%a%defgihj%」「%ab%efghij%」…という文字列を生成してLIKE検索する
|
36
40
|
→取得した中での重みづけが必要なら考慮する必要がある。また、部分一致でのSELECTだと速度面が不安
|