Поиск по полному тексту (MySQL), чувствительный к акценту - PullRequest
0 голосов
/ 16 октября 2018

Надеюсь, я просто не вижу леса за деревьями, но мой полнотекстовый поиск ведет себя очень странно, и я не могу решить это самостоятельно.(Я пытался найти решение, но пока безуспешно, поэтому любая помощь очень ценится.)

Итак, моя проблема: если я ищу " tök " (это означает "тыква "на венгерском языке) список также содержит результаты с" tok"(что означает" case ").Если я ищу тыкву, я явно не хочу чехол для телефона или подобные вещи.

Моя система MySQL, каждая таблица находится в InnoDB, utf8_general_ci

Это (упрощенный) запрос:

SELECT id_item,item_title,tag_name, MATCH (item_title) AGAINST ('tök' IN NATURAL LANGUAGE MODE) AS title_relevance, MATCH (tag_name) AGAINST ('tök' IN NATURAL LANGUAGE MODE) AS tag_relevance 
FROM item_translations 
WHERE NULL IS NULL 
AND (   MATCH (tile_item_title) AGAINST ('+tök' IN NATURAL LANGUAGE MODE ) OR MATCH (tag_name) AGAINST ('+tök' IN NATURAL LANGUAGE MODE ) ) 
AND id_language=1 
ORDER BY title_relevance DESC, tag_relevance DESC 
LIMIT 0,40

PS: ключевые словане всегда на венгерском, потому что этот веб-сайт многоязычный, поэтому мне нужно относительно гибкое решение, которое работает с большинством акцентированных букв (если это возможно)

1 Ответ

0 голосов
/ 17 октября 2018

Равенство в сравнении строк определяется с помощью сопоставления.general будет обрабатывать каждую букву как их (латинский) базовый символ.Вам нужно указать параметры сортировки, которые поддерживают акценты и умлауты, которые вы хотите выделить.

Сопоставление включает специфику языка.Например, для испанского языка n < ñ < o (в то время как n = ñ для практически любого другого языка), для шведского у вас есть Y = Ü, для немецкого (и большинства сопоставлений) есть ß = ss, а для венгерского (и многих других сопоставлений) выиметь o < ö.

Так что для венгерского сайта вы можете выбрать utf8_hungarian_ci, и если ваше программное обеспечение локализуемо для определенного языка (и аудитории), вы можете настроить параметры сортировки этого столбца или позволить администраторуВыбери один.К сожалению, для полнотекстового поиска (в отличие от других сравнений строк, таких как = или order by), вы не можете указать параметры сортировки в запросе на лету, поэтому вам нужно выбрать одну.

На обычном мультиязычном сайте большинство пользователей, вероятно, ожидают, что поиск будет соответствовать очень общей схеме english / russian / китайская схема, и не удивятся, если при вводе tok они найдут tök.Они могут даже раздражаться, чтобы не получить их, особенно если у них нет ö на клавиатуре и они действительно хотят купить тыкву (и знают венгерское слово для этого).Большинство поисковых систем на самом деле стараются не быть слишком узкими и хотят найти café, когда вы вводите cafe, и часто прикладывают некоторые усилия, чтобы найти café, когда вы вводите coffee, caffé илиcafée.

Нет языка, который бы обрабатывал каждый акцент и умлят по-разному.Если вы действительно хотите различить каждый отдельный специальный символ, вы можете попробовать utf8_bin (хотя я не уверен, что я бы назвал его наиболее гибкий ).Важно отметить, что он чувствителен к регистру, но поскольку полнотекстовый поиск всегда нечувствителен к регистру, это не имеет значения.Если вы выполняете другие сравнения строк в этом столбце (например, like), это может быть проблематично.Кроме того, вы потеряете поведение, зависящее от языка, например, Y = Ü или ß = ss (если вы не реализуете его самостоятельно).

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