Задавайте вопросы, мы ответим
Вы не зашли.
Привет! Хочу сделать поиск по статьям, для этого перевел таблицу в тип MyISAM, проиндексировал все текстовые поля, а потом сделал этим полям fulltext используя phpmyadmin. Когда ищу в одном поле например так:
SELECT articles.title
FROM articles
WHERE MATCH (articles.title) AGAINST ('поисковый запрос')
то все работает нормально, но если добавить поиск в нескольких полях, например, так:
SELECT articles.title
FROM articles
WHERE MATCH (articles.title, articles.key_words) AGAINST ('запрос')
то получаю ошибку:
Can't find FULLTEXT index matching the column list
хотя я проиндексировал и добавил fulltext в соответствующие поля.
Как быть, господа?
Неактивен
Скорее всего, Вы добавили отдельные индексы на эти поля. А нужен один индекс над всеми.
Неактивен
А каким образом можно посмотреть как индексы добавлены (по полям или все сразу) ?
И как добавлять индекс сразу на все поля? я так понял примерно так:
ALTER TABLE `articles` ADD INDEX ( `title` , `description` , `key_words` , `short_text` , `text` ) ;
тоесть перечисляем все нужные поля?
И еще при добавлении индекса на поле, получаю такое сообщение:
#1170 - BLOB/TEXT column 'description' used in key specification without a key length
Поле типа text, но как же указать длину поля если она может быть самой разнообразной?
Неактивен
Посмотреть индексы можно командой SHOW CREATE TABLE tablename (или SHOW INDEX FROM tablename,
но во втором варианте чуть сложнее читать на мой взгляд).
Добавляете правильно, только надо добавлять полнотекстовый индекс (ADD FULLTEXT).
Неактивен
спасибо, посмотрел, было куча всяких индексов, я их поудалял через DROP INDEX. Потом создал новый fulltext индекс на все поля, в итоге получилось так при просмотре структуры таблицы:
CREATE TABLE `articles` (
`id` bigint(20) unsigned NOT NULL AUTO_INCREMENT,
`title` varchar(300) CHARACTER SET utf8 COLLATE utf8_unicode_ci NOT NULL,
`category` int(11) NOT NULL,
`type` smallint(6) unsigned NOT NULL,
`language` smallint(5) unsigned NOT NULL,
`description` text CHARACTER SET utf8 COLLATE utf8_unicode_ci NOT NULL,
`key_words` varchar(2000) CHARACTER SET utf8 COLLATE utf8_unicode_ci NOT NULL,
`short_text` text CHARACTER SET utf8 COLLATE utf8_unicode_ci NOT NULL,
`price` float unsigned NOT NULL,
`text` text CHARACTER SET utf8 COLLATE utf8_unicode_ci NOT NULL,
`id_author` bigint(20) unsigned NOT NULL,
`date` date NOT NULL,
`time` time NOT NULL,
`status` varchar(15) NOT NULL,
PRIMARY KEY (`id`),
FULLTEXT KEY `title` (`title`,`description`,`key_words`,`text`)
) ENGINE=MyISAM AUTO_INCREMENT=95 DEFAULT CHARSET=utf8
Поиск опять не работает: тот же запрос
SELECT articles.title
FROM articles
WHERE MATCH (articles.title, articles.key_words) AGAINST ('запрос')
Также уже не работает запрос если указать только 1 поле:
SELECT articles.title
FROM articles
WHERE MATCH articles.title AGAINST ('запрос')
та же ошибка:
Can't find FULLTEXT index matching the column list
Может нужно как-то указать какой индекс использовать?
Отредактированно smackthat (30.05.2009 15:31:40)
Неактивен
все разобрался!!! оказывается если нужно поиск делать допустим по 2м полям, то нужно сделать fulltext на эти 2 поля. При этом поиск на 1 поле работать не будет. Тоесть в моем случае
FULLTEXT KEY `title` (`title`,`description`,`key_words`,`text`)
нужно искать по всем этим полям, а не по некоторым из них. Тоесть так уже будет все работать:
SELECT * FROM articles WHERE MATCH `title`, `description`, `key_words`, `text` AGAINST('запрос')
Неактивен
Да, к сожалению, у FULLTEXT есть такое ограничение — искать нужно по всем полям в индексе,
причем именно в том порядке, как в индексе. Но обычно ищут по всем полям (какой смысл
не искать по каким-то из них?), так что это ограничение тянется из версии в версию.
Неактивен
Возникла еще одна проблемка с поиском. Если например в тексте есть слово микроблоги, то при поиске слово блог не будет найдено. Почему? Получается что поиск работает только с целыми словами, как быть?
Неактивен
Да, полнотекстовый поиск работает с целыми словами. Разумеется. Если Вы хотите, чтобы слово «микроблоги»
находилось при поиске «блогов», подумайте, что Вы будете делать, когда пользователю отдастся что-нибудь
типа «10 лет траура», когда он будет искать «ауру». Если Вы готовы бороться с такими проблемами, то можно
или искать по LIKE/RLIKE, или строить отдельную табличку-индекс со словами и использовать ее при поиске.
Неактивен
спасибо за доходчивый ответ!
Неактивен