Работа с иностранными символами в запросе django

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

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

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

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

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

Unidecode поможет вам решить определенную форму этой проблемы. Unidecode переводит символы не-ascii в ascii, например:

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

Вы можете добиться аналогичного эффекта, разложив символы юникода и удалив комбинированные диакритики. Проблема с этим методом заключается в том, что некоторые символы не разложимы . Итак, в то время как «ö» будет разлагаться на «o» и «умляут», «Ł» (L-ход) останется неизменным. Unidecode успешно переводит «Ł» в «L».

Но Undeicode не решает все ваши проблемы; города могут быть известны под разными именами, или эти имена могут быть написаны по-разному. Например, в США мы называем столицу Китая «Пекином», но мы называли ее «Пекин» (и она по-прежнему называется «Пекин» на шведском языке), а перевод ее имени с помощью unidecode дает нам что-то еще:

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

Лучшее решение – иметь список имен, специфичный для языка, и не использовать фактическое имя города.

Я не думаю, что в джанго есть что-то готовое к этому.

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

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

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

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

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

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

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