Игнорирование 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);