3

これがタスクです。文字列に町名が含まれているかどうかを認識する必要があります。別の言葉 - いくつかのテキストからの町の認識。

入力として、AND ジオコードに対して検索するテキストがあります。町のジオコード リストに応じて、データベースから読み込まれます。

現在の実装では、これらの町のリストをループして、短絡評価を使用して一致させようとします。お気に入り:

if (stripos($text, $currentTown) !== false && 
    preg_match("#\b$currentTown\b#i", $text)) {
    // add town to recognized list
}

そして問題は、たとえば、英国の町のリスト(約40 000)があることです。ループには「かなりの時間がかかります」。

だから私の質問は、認識時間を最適化する方法です。たぶん、配列に高度な検索がありますか?

どんなアイデアでも大歓迎です。

ありがとう。

4

1 に答える 1

0

私の最善の策はすぐに「MySQL 全文検索」を使用することでしたが、私はあなたの問題を解決しようとします. 「最良の結果」から始めようと思います。

  1. すべての町のデータを小文字 (または少なくとも検索する場所) にして、検索する$text = strtolower($text);前に使用します。大文字と小文字をstrpos区別する検索 > 区別しない検索を使用できます

  2. preg_match(); にこだわる理由 あなたがstriposで99%同じことをしているように。スキップできます。

  3. おそらく if strlen($text) < 4 のような小さなチェックを追加すると、恐ろしい結果が得られるため、検索を試みません。

  4. データを長さで並べ替え (これは非常にコストがかかるため、一度実行して保存します)、入力よりも短い currentTowns をスキップします。

  5. データをアルファベット順に並べ替え、最初の文字 (または最初の文字と 2 番目の文字) に一致する部分のみを調べます。

  6. おそらく、結果/検索をキャッシュします。次に、行が見つかった場合にのみキャッシュを検索する必要があります(ただし、キャッシュミスは痛いです)

  7. 大規模なデータ セットがある場合は、PHP の Iterator クラスが役立つ可能性があります。各レコードを調べるプロセスを高速化できます。

于 2012-08-21T00:34:26.157 に答える