質問するログイン新規登録

質問編集履歴

1

見づらかったので改行を調整しました

2016/02/24 01:20

投稿

takushi168
takushi168

スコア228

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だと速度面が不安