2014-12-05 4 views
0

У меня есть таблица и прикладной комбинированный полнотекстовый указатель на (prenom, nom) поля. Ниже приведены данные в этой таблице.Полнотекстовый поиск не работает должным образом

persID prenom  nom (pers table) 
-------------------------------- 
116 te   te 
117 te test  test te 

Теперь я попытался принести выше записи с помощью MATCH и ПРОТИВ. Ниже мой запрос.

SELECT `Pers`.`persID`, Pers.prenom, Pers.nom 
FROM `bdrplus`.`pers` AS `Pers` 
LEFT JOIN `bdrplus`.`pers_detail` AS `PersDetail` 
    ON (`PersDetail`.`persID` = `Pers`.`persID`) 
WHERE `Pers`.`etat` =1 
AND `Pers`.`persID` !=55 
AND MATCH(`Pers`.`prenom`, `Pers`.`nom`) AGAINST('te*' IN BOOLEAN MODE) 

Result 
------------------------ 
persID prenom  nom  
117  te test  test te 

Теперь я попытался с помощью MySQL LIKE (% ..%) оператора. Ниже приведен запрос, который я попробовал.

SELECT `Pers`.`persID` 
FROM `bdrplus`.`pers` AS `Pers` 
LEFT JOIN `bdrplus`.`pers_detail` AS `PersDetail` 
    ON (`PersDetail`.`persID` = `Pers`.`persID`) 
WHERE `Pers`.`etat` =1 
AND `Pers`.`persID` !=55 
AND (Pers.prenom LIKE 'te%' OR Pers.nom LIKE 'te%') 

Result 
----------------------- 
persID prenom  nom (pers table) 
116 te   te 
117 te test  test te 

Я не понимаю, почему я не получаю обе записи, используя МАТЧ ПРОТИВ оператора полнотекстового индекса запроса?

ответ

0

Полнотекстовый поиск имеет несколько настроек, а один - ft_min_word_len, и по умолчанию его значение равно 4, если вы не измените его на меньшее число, слово не будет считаться с символом менее 4 символов.

В вашем случае его возвращения правильного результата, так как у вас есть

MATCH(Pers.prenom, Pers.nom) AGAINST('te*' IN BOOLEAN MODE)

и его соответствие te test и test te

Вы можете проверить ft_mn_word_len с помощью следующей команды

show variables like 'ft_%';

Если вам нужно установите его меньше, чем значение по умолчанию, и разрешите использовать длину слова 2, чтобы изменить это значение.

В Debian/Ubuntu OS вы можете изменить значение ft_min_word_len путем обновления my.cnf файла Расположение файла, как правило, под

/etc/mysql

Итак идите к папке выше и типа

sudo vi my.cnf

Затем в файле проверьте для блока [mysqld] и посмотрите, есть ли переменная, если нет, то ju й добавить строку

ft_min_word_len = 2

Сохранить и и перезапуска MySQL

sudo /etc/init.d/mysql restart

или

sudo service mysql restart

Если вы уже имели полнотекстовые индексы на столе перед делая вышеуказанную операцию, после того, как вышепеременные изменения упадут, индексы и re встроенный или вы можете сделать ремонт таблицу из тузда терминала то, как

repair table table_name quick

+0

Привет, я попытался выше решения, но до сих пор не работаю – Jimit

+0

Что было ваш рано 'ft_min_word_len', вы перезапустить MySQL после изменения? Также после изменения вам нужно сбросить индекс и заново создать его. Или нужно отремонтировать стол. Также обратите внимание, что в полнотекстовом поиске mysql есть список стоп-слов http://dev.mysql.com/doc/refman/5.1/en/fulltext-stopwords.html –

+0

Я использую окна, поэтому я проверил в my.ini. ft_min_word_len там недоступно. Я добавил его и назначил ему 2, а затем перезапустил mysql и reindex fulltext index – Jimit

Смежные вопросы