Игнорирование mysql fulltext stopwords в запросе
Я создаю поиск сайта, который использует полнотекстовый поиск. Сам поиск отлично работает, это не моя проблема. Я строю вместе предоставленные пользователем ключевые слова (MATCH... AGAINST...) с AND, чтобы несколько слов еще больше сузили результаты. Теперь я знаю, что некоторые стоп-слова не индексируются, и это прекрасно со мной, я не хочу их использовать в качестве критериев отбора. Но, если в наборе ключевых слов (от пользователя) предоставляется секундомер, он убивает все результаты (как и ожидалось), даже если слово действительно находится в определенном текстовом блоке.
Мой вопрос: есть ли способ проверить, является ли какое-то слово стоп-словом во время запроса? Мое предпочтительное решение состояло бы в том, чтобы исключить соответствующее слово из критериев поиска (меня не волнует, может ли пользователь сузить результаты по слову "нет", я просто не хочу, чтобы MySQL возвращал пустой набор результатов, потому что пользователь при условии, что он не существует в результатах). Или, мне просто нужно будет очистить список заметок? Большое спасибо за любую помощь.
изменить ----
Извините, но на самом деле нет фрагментов кода для этого. Код работает нормально, фактически точно так, как ожидалось. Это больше логическая проблема, с которой я имею дело. Но в качестве примера, в порядке объяснения:
позволяет сказать, что есть три записи, которые включают слова (но не ограничиваются ими)
1: яблоко, апельсин, манго, банан
2: виноград, апельсин, ананас, манго
3: картофель, манго, дыня, кейра рыцарь
Если слово поиска, введенное пользователем, является манго, все результаты возвращаются правильно. Если слова оранжевые и манго, результаты 1 и 2 возвращаются (правильно). Теперь скажем, банан - это стоп-слово (это не... но пусть оно и есть), если поиск выполняется для оранжевого, мангового и бананового, результаты не возвращаются (потому что банан не находится в полнотекстовом индексе).
То, что я ищу, - это если кто-то еще столкнулся с этой проблемой и имеет способ обойти это. Сортировка:
if 'banana' NOT STOP WORD match 'banana' against `words`. (OBVIOUSLY not real code).
Или... мне просто нужно будет отбросить список закладок...
Ответы
Ответ 1
Вы можете проверить ключевые слова, сравнив все временные слова. Вот список stopwords
Я нашел решение, чтобы отключить стоп-слова из полнотекстового текста.
Вам просто нужно найти файл .cnf и добавить его,
ft_stopword_file = ""
перезапустить движок mysql и перестроить индексы;
Надеюсь, что эта работа
Ответ 2
Как отключить полнотекстовые стоп-слова в MySQL:
В текстовом файле my.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 есть свои отличия в скорости. Один читается быстрее, другие быстрее записывают (читайте больше об этом в Интернете)
Ответ 3
отключить стоп-слово для полнотекстового поиска в mysql, используя следующие шаги
1: откройте файл my.ini в mysql
2: расположите ниже двух строк после строки [mysqld] в my.ini(поиск [mysqld] в файле)
ft_min_word_len=1
ft_stopword_file=""
3: перезагрузите сервер
4: отремонтировать таблицу, используя следующую команду
> repair table tablename;
5: теперь ваш поиск работает....
Ответ 4
Настройка
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';
поскольку это переменная сеанса, она не будет продолжаться, когда ваш сеанс закрыт, поэтому убедитесь, что вы установите его на каждом сеансе или перед оптимизацией или вставкой в таблицы с полным текстом или при обновлении столбца, индексированного по полнотекстовому индексу
Ответ 5
Для случая INNODB можно отключить stop_words при создании индекса.
SET @@SESSION.innodb_ft_enable_stopword = 'OFF';
create table foo
....
fulltext (search_col)
Это приведет к созданию полнотекстового индекса с отключенными стоп-словами. Вы можете проверить, используя следующие запросы.
SET GLOBAL innodb_ft_aux_table = 'schema/foo';
select * from information_schema.innodb_ft_config;
Ваши результаты будут выглядеть так: ![enter image description here]()
Обратите внимание, что use_stopword имеет значение 0.
Ищите use_stopwords
на этой странице документации mysql. и innodb_ft_enable_stopword
заказ innodb_ft_enable_stopword
здесь
Ответ 6
попробуйте использовать MATCH... ПРОТИВ... В РЕЖИМЕ BOOLEAN
Как этот:
ГДЕ МАТЧА (автор, название)
ПРОТИВ ( "происхождение" "В РЕЖИМЕ BOOLEAN);