7

私は、たとえば商品を販売し、「ベンダー検索」を提供するサイトで働いてます。この検索で​​は、都市、郵便番号、地域、および距離(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にあります)を試しましたが、それも非常に遅いです。

したがって、私の質問は、「非常に大きなデータセットでもこの検索を高速化する方法はありますか?」です。

4

3 に答える 3

1

MySQL関数SOUNDS LIKEを試すことができます

SELECT lat, lng FROM my_search_table WHERE term SOUNDS LIKE "the term"
于 2013-03-02T09:17:37.450 に答える
0

kd ツリーまたは三分木を使用して、検索を高速化できます。アイデアは、二分探索を使用することです。

于 2013-03-02T11:27:01.927 に答える