Подтвердить что ты не робот

MySQL FULLTEXT не работает

Я пытаюсь добавить поддержку поиска для своего веб-приложения PHP с использованием индексов MySQL FULLTEXT.

Я создал тестовую таблицу (используя тип MyISAM с одним текстовым полем a) и ввел некоторые примерные данные. Теперь, если я прав, следующий запрос должен возвращать обе эти строки:

SELECT * FROM test WHERE MATCH(a) AGAINST('databases')

Однако он не возвращает ничего. Я провел немного исследований, и я все делаю правильно, насколько я могу судить - таблица - таблица MyISAM, установлены индексы FULLTEXT. Я попытался запустить запрос из приглашения и из phpMyAdmin, без везения. Я пропустил что-то важное?


UPDATE: Хорошо, в то время как решение Cody работало в моем тестовом примере, оно, похоже, не работает в моей фактической таблице:

CREATE TABLE IF NOT EXISTS `uploads` (
  `id` int(11) NOT NULL AUTO_INCREMENT,
  `name` text NOT NULL,
  `size` int(11) NOT NULL,
  `type` text NOT NULL,
  `alias` text NOT NULL,
  `md5sum` text NOT NULL,
  `uploaded` datetime NOT NULL,
  PRIMARY KEY (`id`)
) ENGINE=MyISAM  DEFAULT CHARSET=latin1 AUTO_INCREMENT=6 ;

И данные, которые я использую:

INSERT INTO `uploads` (`id`, `name`, `size`, `type`, `alias`, `md5sum`, `uploaded`) VALUES
(1, '04 Sickman.mp3', 5261182, 'audio/mp3', '1', 'df2eb6a360fbfa8e0c9893aadc2289de', '2009-07-14 16:08:02'),
(2, '07 Dirt.mp3', 5056435, 'audio/mp3', '2', 'edcb873a75c94b5d0368681e4bd9ca41', '2009-07-14 16:08:08'),
(3, 'header_bg2.png', 16765, 'image/png', '3', '5bc5cb5c45c7fa329dc881a8476a2af6', '2009-07-14 16:08:30'),
(4, 'page_top_right2.png', 5299, 'image/png', '4', '53ea39f826b7c7aeba11060c0d8f4e81', '2009-07-14 16:08:37'),
(5, 'todo.txt', 392, 'text/plain', '5', '7ee46db77d1b98b145c9a95444d8dc67', '2009-07-14 16:08:46');

Теперь я запускаю запрос:

SELECT * FROM `uploads` WHERE MATCH(name) AGAINST ('header' IN BOOLEAN MODE)

Что должно возвращать строка 3, header_bg2.png. Вместо этого я получаю еще один пустой набор результатов. Мои параметры для логического поиска приведены ниже:

mysql> show variables like 'ft_%';
+--------------------------+----------------+
| Variable_name            | Value          |
+--------------------------+----------------+
| ft_boolean_syntax        | + -><()~*:""&| |
| ft_max_word_len          | 84             |
| ft_min_word_len          | 4              |
| ft_query_expansion_limit | 20             |
| ft_stopword_file         | (built-in)     |
+--------------------------+----------------+
5 rows in set (0.02 sec)

"header" находится в пределах ограничений длины слова, и я сомневаюсь, что это стоп-слово (я не уверен, как получить список). Любые идеи?

4b9b3361

Ответ 1

Добавьте дополнительные данные. По умолчанию MySQL будет игнорировать любое слово, которое находится в 50% или более строк в таблице, поскольку оно считает, что это будет "шум".

С очень небольшим количеством строк в таблице часто бывает так часто нажимать этот 50% -ный лимит (т.е. если у вас есть две строки, каждое слово составляет не менее 50% строк!).

Ответ 2

Существует два режима для полнотекстового поиска MySQL: режим естественного языка и логический режим. Ограничением режима естественного языка является "... слова, которые присутствуют в 50% или более строк, считаются общими и не совпадают. Полнотекстовый поиск - это поиск по естественному языку, если не указан модификатор". Естественным языком является режим по умолчанию. Это описано в документах Fulltext:

http://dev.mysql.com/doc/refman/5.0/en/fulltext-search.html

Если вы переключите свой запрос на использование логического режима:

SELECT * FROM test WHERE MATCH(a) AGAINST('databases' IN BOOLEAN MODE)

Затем возвращаются две строки.

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

Если ваше приложение будет в значительной степени полагаться на полнотекстовый поиск, вы можете рассмотреть более полнофункциональные пакеты, такие как Lucene/Solr или Sphinx