Нет результатов после удаления mysql ft_stopword_file - PullRequest
4 голосов
/ 16 февраля 2012

У меня есть база данных фильмов, которая содержит информацию о фильме под названием «Да, мы открыты».

При поиске в базе данных у меня возникает проблема, из-за которой поиск «да, мы открыты» возвращает другой заголовок со словами «мы» и «открыт», но не «да» вего описание, даже если мне требуются все слова в логическом режиме (т. е. «да, мы открыты» переводится в '+yes +we\'re +open' перед отправкой в ​​качестве запроса).

Я предположил, что это потому, что «да»находится в списке встроенных стоп-слов.Однако, когда я установил ft_stopword_file = "", перезапустил mysql, а затем repair table [tablename] quick таблицу, которую я ищу, я не получил результатов по запросу "да, мы открыты".Я включил мой my.cnf ниже.Это версия MySQL 5.0.22.Есть идеи?

[mysqld]
query-cache-type = 1
query-cache-size = 8M
max_allowed_packet=500M
ft_min_word_len=2
ft_stopword_file = ""

[myisamchk]
ft_min_word_len=2

set-variable=local-infile=0
datadir=/var/lib/mysql
socket=/var/lib/mysql/mysql.sock
# Default to using old password format for compatibility with mysql 3.x
# clients (those using the mysqlclient10 compatibility package).
# old_passwords=1

skip-bdb

set-variable = innodb_buffer_pool_size=2M
set-variable = innodb_additional_mem_pool_size=500K
set-variable = innodb_log_buffer_size=500K
set-variable = innodb_thread_concurrency=2
[mysql.server]
user=mysql
basedir=/var/lib

[mysqld_safe]
log-error=/var/log/mysqld.log
pid-file=/var/run/mysqld/mysqld.pid
skip-bdb

set-variable = innodb_buffer_pool_size=2M
set-variable = innodb_additional_mem_pool_size=500K
set-variable = innodb_log_buffer_size=500K
set-variable = innodb_thread_concurrency=2

РЕДАКТИРОВАТЬ: Вот несколько примеров запросов:

# 1 - со встроенным файлом стоп-слов

mysql> SHOW VARIABLES LIKE 'ft_%';
+--------------------------+----------------+
| Variable_name            | Value          |
+--------------------------+----------------+
| ft_boolean_syntax        | + -><()~*:""&| | 
| ft_max_word_len          | 84             | 
| ft_min_word_len          | 2              | 
| ft_query_expansion_limit | 20             | 
| ft_stopword_file         | (built-in)     | 
+--------------------------+----------------+
5 rows in set (0.00 sec)

mysql> SELECT title, MATCH(title,description,genre,country) AGAINST (' +yes +we\'re +open' IN BOOLEAN MODE) as title_description_genre_country_score FROM `films` WHERE MATCH(title,description,genre,country) AGAINST (' +yes +we\'re +open' IN BOOLEAN MODE) AND `hidden` <> '1' ORDER BY `title_description_genre_country_score` DESC ;
+-----------------+---------------------------------------+
| title           | title_description_genre_country_score |
+-----------------+---------------------------------------+
| Yes, We?re Open |                                     1 | 
| Present/Future  |                                     1 | 
+-----------------+---------------------------------------+
2 rows in set (0.00 sec)

.... затем отредактируйте my.cnf, добавьте ft_stopword_file="" .....

# 2 Без файла стоп-слов

mysql> SHOW VARIABLES LIKE 'ft_%';
+--------------------------+----------------+
| Variable_name            | Value          |
+--------------------------+----------------+
| ft_boolean_syntax        | + -><()~*:""&| | 
| ft_max_word_len          | 84             | 
| ft_min_word_len          | 2              | 
| ft_query_expansion_limit | 20             | 
| ft_stopword_file         |                | 
+--------------------------+----------------+
5 rows in set (0.00 sec)

mysql> REPAIR TABLE `films` QUICK;
+-------------------------+--------+----------+----------+
| Table                   | Op     | Msg_type | Msg_text |
+-------------------------+--------+----------+----------+
| db.films                | repair | status   | OK       | 
+-------------------------+--------+----------+----------+
1 row in set (0.14 sec)

mysql> SELECT title, MATCH(title,description,genre,country) AGAINST (' +yes +we\'re +open' IN BOOLEAN MODE) as title_description_genre_country_score FROM `films` WHERE MATCH(title,description,genre,country) AGAINST (' +yes +we\'re +open' IN BOOLEAN MODE) AND `hidden` <> '1' ORDER BY `title_description_genre_country_score` DESC ;
Empty set (0.00 sec)

РЕДАКТИРОВАТЬ # 2:Создать таблицу:

mysql> SHOW CREATE TABLE db.films\G;
*************************** 1. row ***************************
Table: films
Create Table: CREATE TABLE `films` (
  `id` varchar(8) NOT NULL default '',
  `title` varchar(255) default NULL,
  `hidden` tinyint(1) default '0',
  `featured` tinyint(1) default NULL,
  `type` varchar(255) default NULL,
  `subtype` varchar(255) default NULL,
  `summary` text,
  `description` text,
  `image_url` varchar(255) default NULL,
  `trailer_url` varchar(255) default NULL,
  `slug` varchar(255) default NULL,
  `category` varchar(255) default NULL,
  `parent` varchar(255) default NULL,
  `related` varchar(255) default NULL,
  `sponsor` varchar(255) default NULL,
  `genre` varchar(255) default NULL,
  `country` varchar(255) default NULL,
  `copresenters` varchar(255) default NULL,
  `original_title` varchar(255) default NULL,
  `director` varchar(255) default NULL,
  `executive_producer` varchar(255) default NULL,
  `producer` varchar(255) default NULL,
  `cinematographer` varchar(255) default NULL,
  `writer` varchar(255) default NULL,
  `editor` varchar(255) default NULL,
  `sound` varchar(255) default NULL,
  `cast` varchar(255) default NULL,
  `language` varchar(255) default NULL,
  `trt` varchar(255) default NULL,
  `year` varchar(255) default NULL,
  `subtitles` varchar(255) default NULL,
  `format` varchar(255) default NULL,
  `color` varchar(255) default NULL,
  `premiere_status` varchar(255) default NULL,
  PRIMARY KEY  (`id`),
  KEY `id` (`id`),
  KEY `type` (`type`),
  KEY `subtype` (`subtype`),
  KEY `slug` (`slug`),
  KEY `category` (`category`),
  KEY `parent` (`parent`),
  KEY `hidden` (`hidden`),
  KEY `featured` (`featured`),
  KEY `copresenters` (`copresenters`),
  KEY `original_title` (`original_title`),
  KEY `director` (`director`),
  KEY `executive_producer` (`executive_producer`),
  KEY `producer` (`producer`),
  KEY `cinematographer` (`cinematographer`),
  KEY `writer` (`writer`),
  KEY `editor` (`editor`),
  KEY `sound` (`sound`),
  KEY `cast` (`cast`),
  KEY `language` (`language`),
  KEY `trt` (`trt`),
  KEY `year` (`year`),
  KEY `subtitles` (`subtitles`),
  KEY `format` (`format`),
  KEY `color` (`color`),
  KEY `premiere_status` (`premiere_status`),
  FULLTEXT KEY `title` (`title`),
  FULLTEXT KEY `summary` (`summary`),
  FULLTEXT KEY `description` (`description`),
  FULLTEXT KEY `genre` (`genre`),
  FULLTEXT KEY `country` (`country`),
  FULLTEXT KEY `title,description` (`title`,`description`),
  FULLTEXT KEY `title,description,genre,country` (`title`,`description`,`genre`,`country`)
) ENGINE=MyISAM DEFAULT CHARSET=utf8
1 row in set (0.00 sec)

Ответы [ 2 ]

2 голосов
/ 23 февраля 2012

Установка переменной stopwords.txt в пустую строку ('') отключает все фильтрацию стоп-слов .(Удалите некоторые слова, которые вам не нужны ... предложение ..)

Указатели созданного вами ПОИСКА ПОЛНОГО ТЕКСТА необходимо уничтожить и создать новый.

Указатели FULLTEXTдолжен быть перестроен после изменения этой переменной или содержимого файла стоп-слов.

Затем используйте REPAIR TABLE tbl_name QUICK.

0 голосов
/ 02 августа 2013

InnoDB не поддерживает восстановление таблиц (вы можете увидеть примечание при выполнении REPAIR TABLE tbl_name QUICK.)

Единственное решение, которое у меня есть, - это поменять движок на MyISAM, хотя это может снизить производительность чтения или записи.

Как отключить полнотекстовые стоп-слова в 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 имеют различия в скорости. Один читает быстрее, другой пишет быстрее (подробнее об этом в Интернете)

...