Странные результаты полнотекстового поиска MySQL, нуждаются в объяснении - PullRequest
4 голосов
/ 31 августа 2010

мой SQL-запрос
SELECT keyword<br> FROM table<br> WHERE MATCH (keyword)<br> AGAINST ('eco*' IN BOOLEAN MODE);
сопоставляет ячейки со следующими словами: economy, ecology, echoscopy (почему?), echo (почему?) И т. Д.

другой SQL-запрос
SELECT keyword<br> FROM table<br> WHERE MATCH (keyword)<br> AGAINST ('eci*' IN BOOLEAN MODE);
соответствует ячейке со словом: echidna.

Пока что оба запроса не соответствуют слову ectoplasm.

Почему echo, echoscopy соответствует 'eco*' и echidna соответствует 'eci*'?

Я вижу, что ключевым элементом в этой проблеме является комбинация букв " ch ".

Почему это работает и как я могу избежать такого соответствия?

Ответы [ 3 ]

1 голос
/ 01 сентября 2010

Проблема (особенность?) Была в сопоставлении. «c» и «ch» рассматривались как равные из-за сопоставления utf8_lithuanian_ci.

Edit:

Изменение параметров сортировки на utf8_unicode_ci устраняет только определенные проблемы.

Реальное решение заключается в использовании utf8_bin , который соответствует двоичным значениям каждого символа, то есть это:

  • с учетом регистра
  • Диакритические знаки
0 голосов
/ 31 августа 2010

Причина, по которой он совпадает, состоит в том, что MATCH ... AGAINST использует регулярные выражения, а * означает, что предыдущий символ ("o") может быть там от 0 до 9999999999999999999 ^ раз.То, что вы хотели сопоставить, это

eco.*

Будет соответствовать "eco" и "ecology", но не "echo".

eco.+

Будет соответствовать "ecology" и "eco system", ноне "эко" и не "эхо".

0 голосов
/ 31 августа 2010

Может быть, вы можете попробовать это

SELECT keyword FROM table WHERE keyword LIKE 'eco%';
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...