Полнотекстовый поиск
Полнотекстовой поиск с СУБД MySQL на сегодняшний день подтверждается только для таблиц типа MyISAM и только для текстовых столбцов переменной длины (TEXT
и VARCHAR
). Эта возможность активируется созданием индекса типа FULLTEXT
для столбцов, по которым необходимо осуществить поиск.
Примечание. Полнотекстовый поиск в СУБД MySQL не чувствителен к регистру. Кроме того, при поиске игнорируются так называемые "общеупотребительные" слова. К ним относятся слишком котроткие слова (по умолчанию состоящие меньше, чем из четырех символов), а также слова, встречающиеся, по крайней мере, в половине записей. Так если в таблице имеются только две записи, то поиск не даст результатов, поскольку каждое слово будет присутствовать в половине записей.
Для использования возможности полнотекстового поиска в таблице, содержащей текстовые поля, необходимо создать индексы FULLTEXT
. Изменить уже существующие таблицы можно при помощи SQL-оператора ALTER
.
SQL-оператора ALTER для добавления индекса FULLTEXT для поля name
В листинге сразу после ключевого слова FULLTEXT
следует имя создаваемого индекса, за которым в скобках указано имя текстового столбца.
Индекс FULLTEXT
можно создать сразу по нескольким столбцам. Для этого в скобках после имени индекса нужно указать имена двух столбцов через запятую:
Примечание. Если индекс создается только по одному столбцу и его имя совпадает с именем столбца, то имя индекса, размещаемое после ключевого слова FULLTEXT
, можно опустить.
На количество индексов в таблице ограничения также не накладываются, допустимо создание нескольких индексов:
Поиск выполняется при помощи функции MATCH(), в качестве аргумента которой выступает один или более индексов типа FULLTEXT, а также функция AGAINST(), которая принимает в качестве аргумента искомую строку.
Оператор SELECT, осуществляющий полнотекстовой поискили так
Результат одинаковый. В данных примерах из таблицы tb3
извлекаются все записи соответствующие статьям, в названии которых встречается слово "Антон
" и "[email protected]
". Синтаксис допускает использование нескольких конструкций MATCH() — AGAINST()
после оператора WHERE
, разделенных логическими операторами OR
или AND
.
В данном примере из талицы tb3 извлекаются все записи, соответствующие статьям, в теле которых присутствует слово "Антон", либо слово "Глеб".
Примечание. Результаты поиска сортируются в порядке уменьшения релевантности. Величина релевантности представляет собой неотрицательное число с плавающей точкой. Релевантность вычисляется на основе количества слов в данной строке столбца, количества уникальных слов в этой строке, общего количества слов в тексте и числа документов (строк), содержащих отдельное слово.
Временные таблицы
База данных MySQL допускает создание временныз таблиц, предназначенных для хранения IP-адресов посетителей и состоящих из четырех полей:
id_ip
—первичный ключ таблицы;ip
— IP-адрес посетителя;id_user
— вторичный ключ, устанавливающий дополнительную связь с таблицей посетителейusers
. В таблицеusers
этот ключ выступает в качестве первичного; putdate — время посещения.
Необходимо решить следующую задачу — выбрать последний IP-адрес для каждого посетителя и время, когда он в него зашел. Данную задачу можно решить в два этапа. Сначала выбрать вторичные ключи пользователей id_user и соответствующее им время последнего посещения, а затем в цикле выбрать соответствующие им IP-адреса.
<?php
//Устанавливаем соединение с базой данных
require_once("../../config/config.php");
//Формируем SQL-запрос
$query="SELECT DISTINCT(id_user) AS id_user, MAX(putdate) AS max_time FROM ips GROUP BY id_user";
//Выполняем SQL-запрос
$fir=mysql_query($query);
if($fir)
{
while($res=mysql_fetch_array
($fir)){
//в цикле формируем второй запрос
$query="SELECT*FROM ips WHERE id_user=".$res['id_user']."";
$final=mysql_query($query);
$result=mysql_fetch_array($final);
echo $result['ip']."-".$result['putdate']."<br>";
}
}
?>
В окне веб-браузера это будет выглядеть ТАК.
Недостатком такого подхода является выполнение второго запроса в цикле, что может создать серьезную нагрузку на сервер MySQL. Выходом из этой ситуации будет создание временной таблицы с результатами первого запроса.
<?php
//Устанавливаем соединение с базой данных
require_once("config.php");
$query="CREATE TEMPORARY TABLE ttt SELECT id_user, putdate, ip FROM ips ORDER BY id_user, time DESC";
if(mysql_query($query))
{
$sel="SELECT id_user, putdate, ip FROM ttt GROUP BY id_user";
$res=mysql_query($sel);
if($res)
{
while($result=mysql_fetch_array
($res)){
echo $result["id_user"]. " ".$result["putdate"]. " ".$result["ip"]."<br>";
}
}
}
?>
После выполнения скрипта таблица ttt
, созданная в памяти, будет удаляться автоматически.
Комментарии(0)
Для добавления комментариев надо войти в систему и авторизоватьсяКомментирование статей доступно только для зарегистрированных пользователей:Зарегистрироваться