5

小さな PHP/MySQL アプリケーションにあいまい検索を実装しようとしています。具体的には、約 2400 レコードのデータベースがあります (レコードは年間約 600 の割合で追加されるため、小さなデータベースです)。対象となる 3 つのフィールドは、番地、姓、および日付です。これらのフィールドのいずれかで検索できるようにしたいのですが、基本的にスペル/文字のエラーに対する許容度があります。つまり、「123 Main Street」の住所は、「123 Main St」、「123 Main St.」、「123 Mian St」、「123 Man St」、「132 Main St」などと一致する必要があり、名前についても同様です。と日付。

他の同様の質問への回答で私が抱えている主な問題:

  • 考えられるすべての間違ったスペルに対して類義語を定義することは不可能です。日付と名前について定義することは忘れてください。
  • Lucene などは、このような限られた検索データ セット (最大 5,000 レコード、1 レコードあたり 3 フィールドと呼びます) に対して非常に重いようです。
  • ワイルドカードを使って何かをするだけでは、すべてのスペル ミスが考えられるため、論理的には思えません。

助言がありますか?MySQL でネイティブに実行できないことはわかっていますが、データ セットが非常に限られているため、比較的シンプルに保ちたいと考えています...おそらく、DB からすべてのレコードを取得する PHP クラス、ある種の比較アルゴリズムを使用して、類似したレコードの ID を返しますか?

ありがとう、ジェイソン

4

2 に答える 2

7

Razzie の回答 (またはDamerau–Levenshteinを使用) は、検索キーへの近さに従って、一致する候補のリストをランク付けします。(注意: キーが「12 Main St」の場合、「13 Main St」のタイピング距離は「12 Moin St」と同じですが、11 および 22 Main St のように低くランク付けするか、除外することもできます。等。)

しかし、ランク付けするのに扱いやすいサイズの候補リストをどのように選択するのでしょうか?

1 つの方法は、検索する文字列内の各単語の metaphone 値 (または double-metaphone を使用した値) を計算することです。これらのメタフォンのそれぞれを、元の文字列を含む行の ID を持つ別のテーブルに保存します。次に、LIKE 'key%' を使用してこれらの metaphone 値をすばやく検索できます。ここで、key は検索テキストの単語の metaphone です。

このスレッドで推奨される回答を確認してください。それは非常にきちんとしていて、巨大ではない DB でうまく機能するはずです。

于 2009-12-17T23:09:56.100 に答える
4

If it is a very small database, you could load all the data at once and use an algorithm like Jaro-Winkler for your search. They have an implementation in PHP, which you can find here.

Imho it works really well. Take a look at an example implementation here. I know that that search uses the same algorithm, and it can find 'Nintedno' very well. It also sorts the results for you, based on which result best matches your query.

于 2009-12-16T13:38:01.350 に答える