Я использую Mysql 5.6.33, настраиваю поиск ПОЛНОГО ТЕКСТА.
Мне известно, что в этой версии есть проблема с апострофами, из-за которой они, похоже, создают проблемы при поиске. https://bugs.mysql.com/bug.php?id=69932
Я попытался обойти эту проблему, сохранив как исходную строку, так и версию с апострофами, удаленными в столбец с индексом FULL TEXT. Но поиск по нему не дает оценку:
SELECT record_id, keywords,
MATCH keywords AGAINST ("+ill +be +there" IN BOOLEAN MODE) AS score
FROM my_table_name
WHERE record_id = 12336
ORDER BY score DESC;
+-----------+----------------------------+-------+
| record_id | keywords | score |
+-----------+----------------------------+-------+
| 12336 | i'll be there ill be there | 0 |
+-----------+----------------------------+-------+
1 row in set (0.03 sec)
Согласно этой ошибке выполнение логического поиска с +I'll
не удастся. Но здесь я выполняю булевский поиск по ill
, без апострофа, который находится в поле. Но все равно получаю балл 0. Если я перехожу в режим ЕСТЕСТВЕННОГО ЯЗЫКА, он работает нормально.
Я предполагаю, что какой бы ни была ошибка, она нарушает индекс и для неапострофной версии слова, что довольно раздражает.
Кто-нибудь сталкивался с этим и нашел исправление / обходной путь?
РЕДАКТИРОВАТЬ : на самом деле это становится еще более странным / более глючным, и похоже, что проблема может заключаться в том, что присутствие стоп-слова заставляет его возвращать ноль баллов:
mysql> SELECT record_id, keywords, MATCH keywords AGAINST ("+be +there" IN BOOLEAN MODE) AS score FROM squirrel_digilearning_modules WHERE record_id = 12336 ORDER BY score DESC;
+-----------+--------------+-------+
| record_id | keywords | score |
+-----------+--------------+-------+
| 12336 | ill be there | 0 |
+-----------+--------------+-------+
1 row in set (0.00 sec)
mysql> SELECT record_id, keywords, MATCH keywords AGAINST ("+there" IN BOOLEAN MODE) AS score FROM squirrel_digilearning_modules WHERE record_id = 12336 ORDER BY score DESC;
+-----------+--------------+-------------------+
| record_id | keywords | score |
+-----------+--------------+-------------------+
| 12336 | ill be there | 7.561973571777344 |
+-----------+----------------------------------+
Почему "+ там" соответствует "+ быть + там", не? Тогда это:
mysql> SELECT record_id, keywords, MATCH keywords AGAINST ("+ill +there" IN BOOLEAN MODE) AS score FROM squirrel_digilearning_modules WHERE record_id = 12336 ORDER BY score DESC;
+-----------+--------------+-------------------+
| record_id | keywords | score |
+-----------+--------------+-------------------+
| 12336 | ill be there | 17.85671615600586 |
+-----------+--------------+-------------------+
1 row in set (0.00 sec)
Выше я сопоставляю слова "плохо" и "там" и получаю хороший результат. Итак, проблема на самом деле "быть"! Я думаю, что это может быть потому, что «быть» это стоп-слово:
mysql> SELECT GROUP_CONCAT(value) FROM INFORMATION_SCHEMA.INNODB_FT_DEFAULT_STOPWORD;
+-----------------------------------------------------------------------------------------------------------------------------------------+
| GROUP_CONCAT(value) |
+-----------------------------------------------------------------------------------------------------------------------------------------+
| a,about,an,are,as,at,be,by,com,de,en,for,from,how,i,in,is,it,la,of,on,or,that,the,this,to,was,what,when,where,who,will,with,und,the,www |
+-----------------------------------------------------------------------------------------------------------------------------------------+