#php #mysql #match #stop-words
Вопрос:
Я использую WAMP на своем компьютере для базы данных с возможностью поиска, которая использует запрос MySQL, который выглядит следующим образом:
SELECT * FROM table_name WHERE MATCH (field_01, field_02, field_03, field_04, field_05, field_06, field_07, field_08, field_09) AGAINST('"$searchterm"' IN BOOLEAN MODE) ORDER BY field_01,field_10,field_11,field_12 ASC
У меня есть полный индекс с полями с 01 по 09, и эта настройка хорошо работала на моем предыдущем компьютере (установке WAMP не менее 5 лет).
Однако на моем новом компьютере (установка WAMP с MySQL версии 5.7.31) он работает только выборочно, т. е. Иногда не возвращает результата.
Я исследовал проблему, и стоп-слова показались ключом к решению, потому что проблема с нулевым результатом возникает при поиске таких слов, как «почему», «для», «и», «или».
Я попробовал метод ft_stopword_file=»» (перезапуск WAMP и восстановление таблицы). Это не помогло.
И самое странное, что тот же самый запрос работает для поискового слова » что » и нескольких других стоп-слов, перечисленных в документации MySQL.
На данный момент я не вижу никакой логики в поведении этого запроса, и я надеюсь, что кто-нибудь сможет указать, что я, возможно, пропустил. Спасибо.
Комментарии:
1. Добро пожаловать в StackOverflow. Почему именно вы хотите сделать это в MySQL?
2. Это довольно запутанная система, которая была создана несколько лет назад. Теперь я просто хочу переместить его на новый компьютер и заставить его работать там. Мне удалось решить большинство проблем, возникших в процессе, но эта поставила меня в тупик.
3. Что ж, есть несколько веских причин для этого рефакторинга. Во-первых, если вашей основной проблемой было наследие, то вот ваш шанс провести рефакторинг. Список стоп — слов не обязательно рассматривать как горизонтальную область. Вместо полей думайте о строках. Становится проще ВЫБРАТЬ все слова или сопоставить их, как в
IN
предложении. Если вы используете плоский файл, это та же проблема в PHP, подумайтеin_array()
или что-то в этом роде.4. Спасибо тебе, шериф.
5. Какой ДВИГАТЕЛЬ используется? Предположительно, InnoDB? Но
ft_stopword
подразумевает ли это МаЙСАМ?
Ответ №1:
Поскольку слово «что» работает для вас, которое является стоп-словом как для InnoDB, так и для MyISAM, эта проблема, похоже, не связана с стоп-словами (или, по крайней мере, не после того, как вы отключили список стоп-слов).
Наиболее вероятная причина заключается в том, что короткие слова не индексируются. Проверьте свою настройку для ft_min_word_len
, которая по умолчанию имеет минимальную длину слова 4 (для MyISAM) и , таким образом, исключает, например for
, но не what
соответствует вашей ситуации. После его изменения вы должны воссоздать свой полнотекстовый индекс (снова). Возможно, вы изменили этот параметр на своем старом сервере и забыли об этом, поэтому проверьте его там, если этот сервер все еще доступен.
Или, может быть, вы использовали InnoDB там, где соответствующая настройка innodb_ft_min_token_size
по умолчанию равна 3, поэтому большинство ваших тестовых слов сработали бы «из коробки». Также проверьте это значение на вашем новом сервере, если вы в настоящее время используете InnoDB. Хотя я предполагаю, что вы бы запомнили явное увеличение этого значения до 4, по какой-то причине это может быть настройкой по умолчанию в вашей настройке wamp.
Комментарии:
1. Это действительно было причиной. Спасибо.