1

RESTフレームワークを使用してJavaでWebサービスを開発しています。

バックエンドとして MySQL 5.1 データベースを使用しています。

テーブルの 1 つで検索操作を実行しており、同様のパターンの使用を停止します。

しかし今、上記の検索に対して「近似文字列一致 (あいまい文字列検索)」を実行したいと考えています。たとえば、23 ST 停留所の場合、ユーザーは検索文字列 23 駅、23 駅、23 駅、23 駅などを指定できます。

このApproximate_string_matchingアルゴリズムについて、リンクhttp://en.wikipedia.org/wiki/Approximate_string_matchingを見つけました

しかし、私はそれを実装する方法がわかりません。

Java/MySQLApproximate_string_matchingアルゴリズムを実装するのを手伝ってください。

前もって感謝します。

4

2 に答える 2

5

調べたいと思うかもしれないことの1つは、レーベンシュタイン距離アルゴリズムです。

レーベンシュタイン距離は、2つのシーケンス間の差を測定するための文字列メトリックです。

Apache Commons Langには、このすぐに利用できる実装があります。getLevenshteinDistance(CharSequence s、CharSequence t、int threshold)を使用 して、指定された文字列とほぼ等しい文字列を取得できます。しきい値は、ソースワードから一定の距離にあるワードを破棄できるので便利であり、不要な計算を回避できます。

より良いアプローチは、MySQL自体が提供するレーベンシュタイン関数を使用することです。実行方法の簡単な例はここにあります。

于 2012-10-23T05:46:13.690 に答える
1

あなたの説明によると、ユーザーが検索文字列を 23 駅、23 駅、23 駅、または 23 駅として提供すると、フィルタリングされた出力は「23 駅停車」になるはずですよね?

したがって、すべての停留所名は XX YY stop のようになると想定しています。ここで、XX は数値で、YY は ST、VT、MT などの駅の短縮形です。

それが正しい場合、これを達成する 1 つの方法は、最初のフィルターの出力が次のフィルターに入力されるように複数のフィルターを実行することです。しかし、その前に、「何をフィルタリングするか」を理解する必要がありますか?

したがって、この特定のケースでは、「23」はクエリ文字列の先頭に存在する必要がある部分文字列であるように思われるため、クエリ文字列から数値部分を抽出する必要があります (Java 正規表現を使用できます) 結果を最初のフィルターとして適用します。したがって、この場合は次のようになります。

 where stops like '23%'

次に、この結果の出力で次のフィルターを適用できます。この場合の次のフィルターは、次の単語の最初の 2 文字 (存在する場合) であり、一貫性のために小文字を適用します。したがって、この場合は 'st になります。 ':

 where LOWER(stops) like '%st%'

同じクエリで両方のフィルターを適用することで (サブクエリを使用してみてください)、クエリ部分自体でこれを実現できます。または、最初のフィルターの結果セットを取り込み、Java 正規表現を使用してその結果セットに残りのフィルターを適用することもできます。

于 2012-10-23T06:24:29.660 に答える