Полнотекстовый поиск. Временные таблицы

Полнотекстовый поиск

Полнотекстовой поиск с СУБД MySQL на сегодняшний день подтверждается только для таблиц типа MyISAM и только для текстовых столбцов переменной длины (TEXT и VARCHAR). Эта возможность активируется созданием индекса типа FULLTEXT для столбцов, по которым необходимо осуществить поиск.

Примечание. Полнотекстовый поиск в СУБД MySQL не чувствителен к регистру. Кроме того, при поиске игнорируются так называемые "общеупотребительные" слова. К ним относятся слишком котроткие слова (по умолчанию состоящие меньше, чем из четырех символов), а также слова, встречающиеся, по крайней мере, в половине записей. Так если в таблице имеются только две записи, то поиск не даст результатов, поскольку каждое слово будет присутствовать в половине записей.

& Для использования возможности полнотекстового поиска в таблице, содержащей текстовые поля, необходимо создать индексы FULLTEXT. Изменить уже существующие таблицы можно при помощи SQL-оператора ALTER.

SQL-оператора ALTER для добавления индекса FULLTEXT для поля name

SQL-оператора ALTER для добавления индекса FULLTEXT для поля name

В листинге сразу после ключевого слова FULLTEXT следует имя создаваемого индекса, за которым в скобках указано имя текстового столбца.

Индекс FULLTEXT можно создать сразу по нескольким столбцам. Для этого в скобках после имени индекса нужно указать имена двух столбцов через запятую:

Индекс FULLTEXT можно создать сразу по нескольким столбцам

Примечание. Если индекс создается только по одному столбцу и его имя совпадает с именем столбца, то имя индекса, размещаемое после ключевого слова FULLTEXT, можно опустить.

На количество индексов в таблице ограничения также не накладываются, допустимо создание нескольких индексов:

На количество индексов в таблице ограничения также не накладываются, допустимо создание нескольких индексов

Поиск выполняется при помощи функции MATCH(), в качестве аргумента которой выступает один или более индексов типа FULLTEXT, а также функция AGAINST(), которая принимает в качестве аргумента искомую строку.

Оператор SELECT, осуществляющий полнотекстовой поиск

Оператор SELECT, осуществляющий полнотекстовой поиск

или так

Оператор SELECT, осуществляющий полнотекстовой поиск

Результат одинаковый. В данных примерах из таблицы tb3 извлекаются все записи соответствующие статьям, в названии которых встречается слово "Антон" и "[email protected]". Синтаксис допускает использование нескольких конструкций MATCH()AGAINST() после оператора WHERE, разделенных логическими операторами OR или AND.

Синтаксис допускает использование нескольких конструкций MATCH() — AGAINST() после оператора WHERE, разделенных логическими операторами OR или AND

В данном примере из талицы tb3 извлекаются все записи, соответствующие статьям, в теле которых присутствует слово "Антон", либо слово "Глеб".

Примечание. Результаты поиска сортируются в порядке уменьшения релевантности. Величина релевантности представляет собой неотрицательное число с плавающей точкой. Релевантность вычисляется на основе количества слов в данной строке столбца, количества уникальных слов в этой строке, общего количества слов в тексте и числа документов (строк), содержащих отдельное слово.

Временные таблицы

База данных MySQL допускает создание временныз таблиц, предназначенных для хранения IP-адресов посетителей и состоящих из четырех полей:

Необходимо решить следующую задачу — выбрать последний IP-адрес для каждого посетителя и время, когда он в него зашел. Данную задачу можно решить в два этапа. Сначала выбрать вторичные ключи пользователей id_user и соответствующее им время последнего посещения, а затем в цикле выбрать соответствующие им IP-адреса.

Выбор IP- адреса каждого посетителя и времени посещения

<?php
//Устанавливаем соединение с базой данных
require_once("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, созданная в памяти, будет удаляться автоматически.

назадвверхвперед
Rambler's Top100