0

sqlce-database を搭載したモバイル デバイスに ac# アプリケーションがあります。

データベースには、都市名または住所を検索したい大きなテーブルが 1 つあります。問題は、都市名が異なるソースからのものであるか、別の人によって挿入されたものであるため、都市にはたとえばSaint XXX、St. YYY、およびSt ZZZが含まれていることです。

私の検索では、 fpr St XXXを検索するか、Saint XXXを検索するかは問題ではありません。結果は同じはずです

もちろん、この問題はセイントという用語だけで発生するのではなく、単なる例です。どのくらいかはまだわかりませんが、さまざまな用語がたくさんあります。

交換など、いくつかのアプローチがありました

SELECT REPLACE(REPLACE(name,'St.','Saint'),'St','Saint') FROM cities WHERE name = REPLACE(REPLACE(@SearchTerm,'St.','Saint'),'St','Saint')

でも出来はイマイチ。

またSoundEx、Saint と St はまったく似ていないため、必要な結果が得られません。

都市名は外部データソースから (mergereplication によって) 取得されるため、サーバー上で更新することはできず、都市名を更新したくありませんが、db に保存されているとおりに使用します。

ニーズに合わせて検索するにはどうすればよいですか?

4

1 に答える 1

2

あいまい検索、すべてのデータベース設計者の悩みの種...

データベース内の各名前を空白と句読点で分割し、結果のサブ文字列を新しいテーブル「city_alias」に入力します。このテーブルには、元の都市テーブルへの外部キーも含まれています。

したがって、「Saint Petersburg」の場合、「Saint」と「Petersburg」の2つのエイリアスが作成されます。エイリアス「Saint」は非常に頻繁に使用される可能性が高いため、検索クエリでは無視する必要があります。

ユーザーが検索に「St.Petersburg」と入力すると、「St」と「Petersburg」に分割されます。「St」は「Saint」と同じ頻度である可能性が高いため、無視する必要があります。したがって、エイリアステーブルで「Petersburg」が検索され、「SaintPetersburg」(および「SaintPetersburg-Kronstadt」または「Petersburg(アラスカ)」)が返されます。

編集:エイリアステーブルには、頻繁なスペルミス(Petersbourg)、ニックネーム(Piter)、古い名前(Leningrad)、またはローカルスペル(Петербу́рг)を手動で入力することもできます。

于 2012-11-22T13:17:47.493 に答える