私は、たとえば商品を販売し、「ベンダー検索」を提供するサイトで働いています。この検索では、都市、郵便番号、地域、および距離(kmまたはマイル)を入力すると、サイトにベンダーのリストが表示されます。
そのために、ベンダーのデータベースがあります。これらのベンダーを保存するフォームに完全な住所を入力し、[保存]ボタンをクリックすると、緯度と経度を取得するためにGoogleマップへのリクエストが行われます。
誰かが検索を行うとき、私はすべての検索用語とその緯度/経度を格納しているテーブルを調べます。このテーブルは次のようになります
+--------+-------+------+
| term | lat | lng |
+--------+-------+------+
したがって、最初のクエリは非常に単純なものです
select lat, lng from my_search_table where term = "the term"
結果が見つかったら、訪問者が希望する範囲内のすべてのベンダーを適切な方法で検索し、結果を地図に印刷します。
結果が見つからない場合は、levenshtein関数を使用して検索します。これは、bruxellesの代わりにbruxelleまたはbruxelesを作成する人が非常に一般的であり、Googleマップに常にリクエストを送信したくないためです(「いくつかの統計を取得するために私のテーブルの「検索回数」列)
そこで、where句を指定せずにmy_search_timeをリクエストし、すべての結果をループして、最小のlevensthein距離を取得します。最小の結果が2より大きい場合は、Googleマップに座標を要求します。
これが私の問題です。一部の国(世界中にいくつかのサイトがあります)では、my_search_tableに15〜20k以上のエントリがあります...そしてphpは(本当に)そのようなデータをループするのが好きではなく(私は完全に理解しています)、私のリクエストはphpタイムアウトに該当します。このタイムアウトを増やすこともできますが、問題は数か月で同じになります。
そこで、私はlevensthein MySQL関数(stackoverflow btwにあります)を試しましたが、それも非常に遅いです。
したがって、私の質問は、「非常に大きなデータセットでもこの検索を高速化する方法はありますか?」です。