PHP: СОПОСТАВЛЕНИЕ не работает для определенных стоп-слов, но работает для других (без очевидной логики)

#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. Это действительно было причиной. Спасибо.