игнорирование полнотекстовых стоп-слов mysql в запросе
Я создаю поиск для сайта, который использует полнотекстовый поиск. Сам поиск работает отлично, это не моя проблема. Я строю вместе предоставленные пользователем ключевые слова (MATCH... ПРОТИВ...) и так, что несколько слов еще больше сузить результаты. Я знаю, что некоторые стоп-слова не индексируются, и меня это устраивает, я не хочу использовать их в качестве критериев отбора. Но, если стоп-слово предоставляется в наборе ключевых слов (пользователем), оно убивает все результаты (как и ожидалось) даже если слово действительно находится в определенном текстовом блоке.
мой вопрос: есть ли способ проверить, является ли определенное слово стоп-словом во время запроса? Моим предпочтительным решением было бы просто исключить соответствующее слово из критериев поиска (мне все равно, может ли пользователь сузить результаты словом "ни", я просто не хочу, чтобы MySQL возвращал пустой результирующий набор, потому что пользователь предоставил его, даже если ни один не существует в результатах). Или мне просто придется опустошить список стоп-слов? Большое спасибо за любую помощь.
изменить ---- Извините, но на самом деле для этого нет фрагментов кода. Код работает нормально, на самом деле именно так, как ожидалось. Это скорее логическая проблема, с которой я имею дело. Но в качестве примера, в порядке объяснения:
допустим, есть три записи, которые содержат слова (но не ограничиваются)
1: яблоко, апельсин, манго, банан 2: виноград, апельсин, ананас, манго 3: картофель, манго, дыня, Кира Найтли!--2-->
Если введенное пользователем слово поиска-mango, все результаты возвращаются правильно. Если слова оранжевый и манго, результаты 1 и 2 возвращаются (правильно). Теперь, скажем, банан-стоп-слово (это не так... но предположим, что это так), если поиск для orange, mango и banana, результаты не возвращаются (потому что banana не находится в полнотекстовом индексе).
то, что я ищу, - это если кто-то еще столкнулся с этой проблемой и имеет способ работай над этим. Вида:
if 'banana' NOT STOP WORD match 'banana' against `words`. (OBVIOUSLY not real code).
или... мне просто придется отказаться от списка стоп-слов...
5 ответов
вы можете проверить ключевые слова, сравнивая все стоп-слова. Вот список стоп-слова Я нашел решение для отключения стоп-слов из fulltext. Вам просто нужно найти .CNF файл и добавить это
ft_stopword_file = ""
перезапустить MySQL engine и перестроить индексы;
надеюсь, это сработает
как отключить полнотекстовые стоп-слова в MySQL:
в моем.ini текстовый файл (MySQL):
ft_stopword_file = "" or link an empty file "empty_stopwords.txt"
ft_min_word_len = 2
// установите минимальную длину, но имейте в виду, что более короткие слова (3,2) значительно увеличат время запроса, особенно если поля полнотекстового индексированного столбца большие.
сохраните файл, перезапустите сервер.
следующим шагом должно быть восстановление индексов с помощью этого запроса:
REPAIR TABLE tbl_name QUICK.
однако, это не будет работать, если вы таблица использует механизм хранения InnoDB. Вам придется изменить его на MyISAM:
ALTER TABLE t1 ENGINE = MyISAM;
Итак, еще раз:
1. Edit my.ini file and save
2. Restart your server (this cannot be done dynamically)
3. Change the table engine (if needed) ALTER TABLE tbl_name ENGINE = MyISAM;
4. Perform repair REPAIR TABLE tbl_name QUICK.
имейте в виду, что InnoDB и MyISAM имеют свои различия в скорости. Один читает быстрее, другой пишет быстрее (подробнее об этом читайте в интернете )
отключить стоп-слов для полнотекстового поиска в MySQL, используя эти шаги
1: откройте Мой.ini файл в mysql
2: Поместите ниже двух строк после строки [mysqld] в my.ini (поиск [mysqld] в файле)
ft_min_word_len=1
ft_stopword_file=""
3: перезагрузите сервер
4: восстановите таблицу, используя следующую команду
> repair table tablename;
5: Теперь ваш поиск работы....
попробуйте использовать матч ... против...в логическом режиме Как этот: Где совпадение (автор, название) Против ("происхождение "" в БУЛЕВОМ режиме);
настройка
ft_stopword_file = ""
не работал для меня, я использую таблицы INNODB и MySQL 5.6 (стоп-слова все еще не индексируются в полнотекстовых индексах после оптимизации связанной таблицы)
это решение работает (даже если вы не супер-пользователя) :
CREATE TABLE mydb.stopwordslist(value VARCHAR(20)) ENGINE = INNODB;
INSERT INTO mydb.stopwordslist(value) VALUES ('skipthisword');
для всех пользователей, но вам все равно нужны права супер пользователя:
SET GLOBAL innodb_ft_server_stopword_table = 'mydb/stopwordslist';
только для пользователя (предполагая, что это тот, кто воссоздает индексы и обновляет столбцы)
SET SESSION innodb_ft_user_stopword_table = 'mydb/stopwordslist';
как переменную сеанса, он не будет длиться, когда ваш сеанс закрыт, поэтому убедитесь, что вы установили его на каждом сеансе или перед оптимизацией или вставкой в таблицы с полнотекстовым индексом или при обновлении столбца, индексированного полнотекстовым индексом