игнорирование полнотекстовых стоп-слов 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';

как переменную сеанса, он не будет длиться, когда ваш сеанс закрыт, поэтому убедитесь, что вы установили его на каждом сеансе или перед оптимизацией или вставкой в таблицы с полнотекстовым индексом или при обновлении столбца, индексированного полнотекстовым индексом