2012-01-23 10 views
2

GeoNames.comからインポートした都市名を検索しています。いくつかの都市には国際的な文字があります。たとえば、「イスタンブール」は実際にはデータベース内の「イスタンブール」です。djangoクエリで外国文字を扱う

人が「イスタンブール」を検索すると、イスタンブールは出現しません。

私はイスタンブール=イスタンブール

は現在、それはだことを知っているであろう検索にフィルタやデコーダを追加することができる方法があります:

cities = City.objects.filter(name__icontains=query) 
+0

"現在、それはありますか"と言うと、 "現在、検索操作はこのコードで実装されています:"という意味ですか? –

+0

どのような動作が必要ですか?アクセントのないラテン文字とアクセントのないラテン文字を一致させたいですか?日本の「イスタンブール」の検索などの音訳をしたいですか?スペルミスはどうですか?検索結果がどのような順序で返されますか? –

+0

データベース照合と接続照合はどのようなものですか? –

答えて

3

Unidecodeこの問題の特定のフォームを解決するのに役立ちます。 Unidecodeは、たとえば、ASCIIに非ASCII文字を変換します:

>>> from unidecode import unidecode 
>>> unidecode(u"İstanbul") 
'Istanbul' 

あなたはUnicode文字を分解し、組み合わせ発音区別符号を除去することにより、同様の効果を得ることができます。このテクニックの問題は、特定の文字が分解可能でないことです。。したがって、 "ö"は "o"とウムラウトに分解されますが、 "Ł"(L-ストローク)は同じままです。 Unidecodeは「Ł」を「L」に変換します。

しかし、Undeicodeはすべての問題を解決するわけではありません。都市は異なる名前で知られているか、またはこれらの名前は別々に書かれています。たとえば、米国では中国の首都を「北京」と呼んでいますが、それを「北京」と呼んでいます(スウェーデン語ではまだ北京と呼ばれています)。unidecodeで名前を変えてください。

>>> unidecode(u"\u5317\u4EB0") 
'Bei Jing ' 

最も適切な解決策は、言語固有の名前リストを使用して、市の実際の名前を使用しないことです。

1

私は準備ができて何かがあるとは思わないが、それはジャンゴでそれのために。

私はDatabase内にNameCombinationsという名前の別の列を作成します。 Istanbulİstanbulと

cities = City.objects.filter(NameCombinations__icontains=query) 
+0

私はあなたの最善の策が代替のスペルのリストを維持することに同意します。 – monkut

0

それはあなたが望む行動についての詳細なしに決定的な助言を与えることは難しい照会します。

しかし、明らかなステップの1つは、それぞれの名前(小文字、アクセント記号など)の正規形を定義し、正式な名前に加えてデータベースの第2列に正規形を保存することです名。次に、検索文字列を正準形式にもマップします。したがって、「イスタンブール」はカノニカル形式の「イスタンブール」である可能性があります。

別の明白なステップは、都市名を都市に関する残りの情報とは別のテーブルに分けることです。これにより、各都市はいくつかの名前、すなわち同義語を持つことができます。次に、各都市名に対して、必要な数の同義語を定義して、ユーザーが好む別のスペルをキャッチします。たとえば、「イスタンブール」と「イスタンブール」を「イスタンブール」の同義語として入力できます。

もちろん、これらのアプローチを併用することもできます。

-1

データベースに適切な照合順序を設定すると、照合は必要なだけ正確に行われます。

関連する問題