3

Metaphone および Double Metaphone 検索アルゴリズムについて学習したばかりで、いくつか質問があります。Metaphone Wiki ページによると、実装、特に MySQL 実装を含むいくつかのソースが見つかりました。私のテスト データベースでテストしたかったので、最初にここにある metaphone.sql ファイル (ダブル metaphone 関数を含む) をインポートしました。

現在、「アフガニスタン」、「アルバニア」、「アルジェリア」など、「名前」列にすべての国がリストされているテーブル、国があります。まず、実際に新しい国を作成したかったのです。表の列に、各国の Double Metaphone 文字列を格納します。次のコードを実行しました。

UPDATE country SET NameDM = dm(name)

すべてが正しく機能しました。アフガニスタンのメタフォン文字列は「AFKNSTN」、アルバニアは「ALPN」、アルジェリアは「ALKR;ALJR」などです。「すごい」と思いました。

ただし、テーブルにクエリを実行しようとすると、結果が得られませんでした。metaphone.sql の作成者によると、次の SQL ステートメントの構文に従いました。

SELECT Name FROM tblPeople WHERE dm(Name) = dm(@search)

そこで、このコードを次のように変更しました。

SELECT * FROM country WHERE dm(name) = dm(@search)

もちろん、「@search」を探している検索語に変更しましたが、SQL クエリを実行するたびに 0 件の結果が得られました。

誰でもこの問題を説明できますか? 何か重要なことを見逃しているのでしょうか、それとも単に Metaphone アルゴリズムを誤解しているだけなのでしょうか?

ありがとうございました!

4

3 に答える 3

2
SELECT * FROM country WHERE NameDM = dm(@search)

検索を行うたびにすべての国の DM を計算しているわけではないので、最終的にはおそらくこれが必要です。あなたが持っていたものは、うまくいったはずです。次のようにしてトラブルシューティングを行うことができます。

SELECT dm('Albania')

... ALPN を取得する必要があります。さて、何を手に入れるのか...

SELECT * FROM country WHERE NameDM = 'ALPN'

?

于 2012-04-30T01:40:18.383 に答える
2

照合/文字セット/エンコーディングをよく見てください (列レベルまで定義できます)。照合は文字列の比較方法を定義しますが、文字セットは特定の照合が使用されることを意味する場合があります。リテラル文字列の文字セットが異なるため、文字列比較が失敗する可能性があります。

これでさえ明らかになるかもしれません

select name, length(name), char_length(name), @search, length(@search), char_length(@search) from tbl

.

show variables like 'character%'

.

show create table tbl
于 2012-04-28T04:38:07.480 に答える