Нет способа сделать LIKE '%pattern%'
эффективными запросы. Как только вы получаете нетривиальный объем данных, использование этих подстановочных запросов выполняется в сотни или тысячи раз медленнее, чем использование решения для полнотекстовой индексации.
Вы должны посмотреть на презентацию, которую я сделал для MySQL University:
http://www.slideshare.net/billkarwin/practical-full-text-search-with-my-sql
Вот как заставить его работать:
Сначала убедитесь, что ваша таблица использует механизм хранения MyISAM. Индексы MySQL FULLTEXT поддерживают только таблицы MyISAM. ( редактировать 01.11.2012: MySQL 5.6 представляет тип индекса FULLTEXT для таблиц InnoDB.)
ALTER TABLE Entries ENGINE=MyISAM;
Создание полнотекстового индекса.
CREATE FULLTEXT INDEX searchindex ON Entries(title, tags, entry);
Поиск!
$search = mysql_real_escape_string($search);
$titles = mysql_query("SELECT title FROM Entries
WHERE MATCH(title, tags, entry) AGAINST('$search')");
while($row = mysql_fetch_assoc($titles)) {
$result[] = $row['title'];
}
Обратите внимание, что столбцы, которые вы называете в предложении MATCH
, должны быть такими же столбцами в том же порядке, что и те, которые вы объявили в определении полнотекстового индекса. В противном случае это не сработает.
Я пытался использовать полнотекстовый поиск по индексу, но так и не смог заставить его работать ... Мне просто интересно, можно ли сделать это более эффективным.
Это все равно, что сказать: «Я не мог понять, как пользоваться этой бензопилой, поэтому я решил срубить это красное дерево с помощью карманного ножа. Как я могу сделать так же хорошо, как бензопилу?»
Относительно вашего комментария о поиске слов, которые соответствуют более 50% строк.
В руководстве по MySQL написано this :
Пользователи, которым необходимо обойти ограничение в 50%, могут использовать логический режим поиска; см. Раздел 11.8.2, «Булевы полнотекстовые поиски» .
И это :
50% порог для естественного языка
поиски определяется
выбрана конкретная схема взвешивания. к
отключите его, ищите следующее
строка в хранилище / myisam / ftdefs.h:
# определение GWS_IN_USE GWS_PROB
Измените эту строку на:
# определение GWS_IN_USE GWS_FREQ
Затем перекомпилируйте MySQL. Нет нужды
перестроить индексы в этом случае.
Кроме того, вы можете искать стоп-слов . Это слова, которые игнорируются полнотекстовым поиском, потому что они слишком распространены. Такие слова, как "и" и так далее. Смотри http://dev.mysql.com/doc/refman/5.1/en/fulltext-stopwords.html