Accent sensitive FULL TEXT search (MySQL)

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

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

Моя система - это 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 ответ


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

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

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

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

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