Работа с иностранными символами в запросе Django - PullRequest
2 голосов
/ 23 января 2012

Я строю поиск названий городов, импортированных из GeoNames.com. Некоторые из городов имеют международные символы в названии. Например, «Стамбул» на самом деле является «Стамбул» в базе данных.

Когда люди ищут "Стамбул", Стамбул не появляется.

Есть ли способ добавить фильтр или декодер к поиску, который бы знал, что Стамбул = Стамбул

В настоящее время это:

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

Ответы [ 4 ]

3 голосов
/ 23 января 2012

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 голос
/ 23 января 2012

Не думаю, что в django есть что-то готовое.

Я бы создал отдельный столбец в базе данных, называемый чем-то вроде NameCombination, в который я бы поместил все возможные комбинации, например Стамбул Стамбул и будет запрос

cities = City.objects.filter(NameCombinations__icontains=query)
0 голосов
/ 23 января 2012

После того, как вы установили соответствующий порядок сортировки в базе данных, сравнение будет выполнено именно так, как вы хотите.

0 голосов
/ 23 января 2012

Трудно дать четкий совет без дополнительной информации о том, какое поведение вы хотите.

Однако, один очевидный шаг - определить каноническую форму для каждого имени (строчные буквы, без акцентов и т. Д.) И сохранить каноническую форму имени во втором столбце базы данных, в дополнение к правильному имени. , Затем сопоставьте строку поиска с канонической формой. Таким образом, «Стамбул» может быть канонической формой «Стамбул».

Еще один очевидный шаг - разделить название города на отдельную таблицу и остальную информацию о городе. Это позволяет каждому городу иметь несколько названий, то есть синонимов. Затем для каждого названия города определите столько синонимов, сколько необходимо, чтобы поймать разные варианты написания, которые предпочитают пользователи. Например, вы можете ввести «Стамбул» и «イ ス タ ン ブ ル» как синонимы «Стамбул».

Конечно, вы можете использовать оба этих подхода вместе.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...