#mysql #database #performance #full-text-search #innodb
#mysql #База данных #Производительность #полнотекстовый поиск #innodb
Вопрос:
У меня есть MySQL 5.7.31
таблица InnoDB с включенным полнотекстовым индексом…
если я ищу более длинное слово, я получаю результаты:
SELECT * FROM my_table WHERE match(my_title) against('landscape in' IN BOOLEAN MODE)
если я ищу полный текст для короткого слова (например in
), я не получаю результатов
SELECT * FROM my_table WHERE match(my_title) against('in' IN BOOLEAN MODE)
данные есть, я могу найти их с like %%
запросом:
SELECT * FROM my_table WHERE my_title LIKE '%in%'
Я установил эти два в / etc /my.cnf, я понимаю, что один для InnoDB, а другой для MyISAM, я перезапустил MySQL, я все еще не могу выполнить приведенный выше короткий полнотекстовый запрос.
ft_min_word_len=1
innodb_ft_min_token_size=1
Редактировать:
Если у меня есть значение, подобное landscape in Paris
, то я получаю данные для against(' landscape Paris' IN BOOLEAN MODE)
, но НЕ для against(' landscape in Paris' IN BOOLEAN MODE)
Возможно, in
это зарезервированное слово?
Ответ №1:
«in», вероятно, находится в «стоп-листе». Измените спецификацию файла списка остановок.
После изменения минимального значения или списка остановок необходимо перестроить полнотекстовый индекс (ы). (Перезапуск MySQL не требуется.)
Альтернативу, которую я использовал в одной ситуации: я добавил
к длинным словам. Например, against(' landscape in Paris' IN BOOLEAN MODE)
вероятно, достигнет вашей цели без изменения минимального значения или списка стоп-слов.
(Да, есть несколько «различий» между MyISAM и InnoDB. Я не нашел окончательного списка в документах. Вот моя попытка составить такой список:http://mysql.rjweb.org/doc.php/myisam2innodb#fulltext)