SQLinfo.ru - Все о MySQL Webew.ru: теория и практика веб-технологий

Форум пользователей MySQL

Задавайте вопросы, мы ответим

Вы не зашли.

#1 30.05.2009 00:37:13

smackthat
Завсегдатай
Зарегистрирован: 18.02.2009
Сообщений: 32

Проблема с поиском

Привет! Хочу сделать поиск по статьям, для этого перевел таблицу в тип 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 в соответствующие поля.
Как быть, господа?

Неактивен

 

#2 30.05.2009 06:40:26

paulus
Администратор
MySQL Authorized Developer and DBA
Зарегистрирован: 22.01.2007
Сообщений: 6756

Re: Проблема с поиском

Скорее всего, Вы добавили отдельные индексы на эти поля. А нужен один индекс над всеми.

Неактивен

 

#3 30.05.2009 11:16:49

smackthat
Завсегдатай
Зарегистрирован: 18.02.2009
Сообщений: 32

Re: Проблема с поиском

А каким образом можно посмотреть как индексы добавлены (по полям или все сразу) ?
И как добавлять индекс сразу на все поля? я так понял примерно так:
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, но как же указать длину поля если она может быть самой разнообразной?

Неактивен

 

#4 30.05.2009 14:12:57

paulus
Администратор
MySQL Authorized Developer and DBA
Зарегистрирован: 22.01.2007
Сообщений: 6756

Re: Проблема с поиском

Посмотреть индексы можно командой SHOW CREATE TABLE tablename (или SHOW INDEX FROM tablename,
но во втором варианте чуть сложнее читать на мой взгляд).

Добавляете правильно, только надо добавлять полнотекстовый индекс (ADD FULLTEXT).

Неактивен

 

#5 30.05.2009 14:54:25

smackthat
Завсегдатай
Зарегистрирован: 18.02.2009
Сообщений: 32

Re: Проблема с поиском

спасибо, посмотрел, было куча всяких индексов, я их поудалял через 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)

Неактивен

 

#6 30.05.2009 15:41:50

smackthat
Завсегдатай
Зарегистрирован: 18.02.2009
Сообщений: 32

Re: Проблема с поиском

все разобрался!!! оказывается если нужно поиск делать допустим по 2м полям, то нужно сделать fulltext на эти 2 поля. При этом поиск на 1 поле работать не будет. Тоесть в моем случае
FULLTEXT KEY `title` (`title`,`description`,`key_words`,`text`)

нужно искать по всем этим полям, а не по некоторым из них. Тоесть так уже будет все работать:
SELECT * FROM articles WHERE MATCH `title`, `description`, `key_words`, `text` AGAINST('запрос')

Неактивен

 

#7 31.05.2009 00:19:25

paulus
Администратор
MySQL Authorized Developer and DBA
Зарегистрирован: 22.01.2007
Сообщений: 6756

Re: Проблема с поиском

Да, к сожалению, у FULLTEXT есть такое ограничение — искать нужно по всем полям в индексе,
причем именно в том порядке, как в индексе. Но обычно ищут по всем полям (какой смысл
не искать по каким-то из них?), так что это ограничение тянется из версии в версию.

Неактивен

 

#8 14.06.2009 18:59:19

smackthat
Завсегдатай
Зарегистрирован: 18.02.2009
Сообщений: 32

Re: Проблема с поиском

Возникла еще одна проблемка с поиском. Если например в тексте есть слово микроблоги, то при поиске слово блог не будет найдено. Почему? Получается что поиск работает только с целыми словами, как быть?

Неактивен

 

#9 15.06.2009 21:28:19

paulus
Администратор
MySQL Authorized Developer and DBA
Зарегистрирован: 22.01.2007
Сообщений: 6756

Re: Проблема с поиском

Да, полнотекстовый поиск работает с целыми словами. Разумеется. Если Вы хотите, чтобы слово «микроблоги»
находилось при поиске «блогов», подумайте, что Вы будете делать, когда пользователю отдастся что-нибудь
типа «10 лет траура», когда он будет искать «ауру». Если Вы готовы бороться с такими проблемами, то можно
или искать по LIKE/RLIKE, или строить отдельную табличку-индекс со словами и использовать ее при поиске.

Неактивен

 

#10 20.06.2009 22:29:39

smackthat
Завсегдатай
Зарегистрирован: 18.02.2009
Сообщений: 32

Re: Проблема с поиском

спасибо за доходчивый ответ!

Неактивен

 

Board footer

Работает на PunBB
© Copyright 2002–2008 Rickard Andersson