Блиндер буду -:-Скрипт поиска на PHP. Доступно для начинающих.




Разделы сайта

Каталог софта

Как создается сайт

Free hosting

Сервисы сайта

Скачать бесплатно!



Скрипт поиска на PHP. Доступно для начинающих.

PHP cкрипт поиска по сайту.


Одним из ключевым моментом юзабилити любого сайта является поисковая служба. Рассмотрим организацию поиска по базе данных MYSQL.

Основные понятия, необходимые для написания скрипта поиска по сайту.

Начиная с версий 3.23.23 MySQL, осуществляет поддержку полнотекстового поиска и индексации.
Полнотекстовые индексы в могут быть созданы в таблицах MyISAM, в столбцах типа VARCHAR и TEXT и обозначаются FULLTEXT.

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

При использовании функции MATCH() в выражении WHERE, возвращаемые строки автоматически сортируются, начиная с наиболее релевантных.

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

пример поискового запроса

SELECT * FROM articles 
WHERE MATCH (Столбцы с индексом FULLTEXT)
AGAINST (`Поисковое слово`);

В случае отсутствия выражений WHERE и ORDER BY возвращаемые строки не упорядочиваются.

SELECT id, MATCH (Столбцы с индексом FULLTEXT)
 AGAINST (`Поисковое слово`) FROM articles;

Можно реализовать запрос так, что будет возвращено значение релевантности и, кроме того, отсортированы строки в порядке убывания релевантности. Для этого необходимо, указать MATCH() дважды.
Это не приводит к дополнительным издержкам, так как оптимизатор MySQL учитывает эти два вызова MATCH() как идентичные и запускает код полнотекстового поиска только один раз.

SELECT id, body, MATCH(Столбцы с индексом FULLTEXT)
AGAINST (`Поисковое слово`) AS score FROM 
articles WHERE MATCH (Столбцы с индексом FULLTEXT)
AGAINST (`Поисковое слово`);

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

Начиная с MySQL 4.0.1 возможен полнотекстовый поиск также и в логическом режиме с использованием модификатора IN BOOLEAN MODE.

SELECT * FROM articles WHERE MATCH (Столбцы с индексом FULLTEXT) AGAINST (`Поисковое слово` IN BOOLEAN MODE);

В логическом режиме полнотекстового поиска поддерживаются следующие операторы:
  • {+} Предшествующий слову знак ``плюс`` показывает, что это слово должно присутствовать в каждой возвращенной строке.

  • {-} Предшествующий слову знак ``минус`` означает, что это слово не должно присутствовать в какой-либо возвращенной строке.

  • { } По умолчанию (если ни плюс, ни минус не указаны) данное слово является не обязательным, но содержащие его строки будут оцениваться более высоко. Это имитирует поведение команды MATCH() ... AGAINST() без модификатора IN BOOLEAN MODE.

  • {< >} Эти два оператора используются для того, чтобы изменить вклад слова в величину релевантности, которое приписывается строке. Оператор < уменьшает этот вклад, а оператор > - увеличивает его. См. пример ниже.

  • {( ) }Круглые скобки группируют слова в подвыражения.

  • { ~} Предшествующий слову знак ``тильда`` воздействует как оператор отрицания, обуславливая негативный вклад данного слова в релевантность строки. Им отмечают нежелательные слова. Строка, содержащая такое слово, будет оценена ниже других, но не будет исключена совершенно, как в случае оператора - ``минус``.

  • {*} Звездочка является оператором усечения. В отличие от остальных операторов, она должна добавляться в конце слова, а не в начале.

  • {"} Фраза, заключенная в двойные кавычки, соответствует только строкам, содержащим эту фразу, написанную буквально.

Ограничения для полнотекстового поиска

  1. Все параметры функции MATCH() должны быть столбцами одной и той же таблицы, т.е. частью одного и того же индекса FULLTEXT, за исключением работы MATCH() в режиме IN BOOLEAN MODE.

  2. Список столбцов в команде MATCH() должен точно соответствовать списку столбцов в определении индекса FULLTEXT для этой таблицы, за исключением работы данной функции MATCH() в режиме IN BOOLEAN MODE.

  3. Аргумент в выражении AGAINST() должен быть неизменяемой строкой.

Сам скрипт поиска, содержит форму, для ввода ключевых слов и обработчик формы.

<?php
/*Создаем таблицу
CREATE TABLE `articles` (
  `id_article` int(10) unsigned NOT NULL auto_increment,
  `name` tinytext NOT NULL,
  `description` tinytext NOT NULL,
  PRIMARY KEY  (`id_article`),
  FULLTEXT KEY `name` (`name`),
FULLTEXT KEY `description` (`description`)
) ENGINE=MyISAM DEFAULT CHARSET=cp1251;
*/
//Подключаем конфигурационный файл или код 
//подключения к базе данных
$dblocation "localhost";
    
$dbname "dir";
    
$dbuser "dir";
    
$dbpasswd "res";
// Устанавливаем соединение с базой данных
  
$dbcnx = @mysql_connect($dblocation,$dbuser,$dbpasswd);
  if (!
$dbcnx
exit( 
"<P>В настоящий момент сервер базы данных не доступен, 
поэтому корректное отображение страницы невозможно.</P>" 
);
  if (! @
mysql_select_db($dbname,$dbcnx)) 
exit ( 
"<P>В настоящий момент база данных не доступна, поэтому 
корректное отображение страницы невозможно.</P>" 
);
  
// Определяем версию сервера
  
$query "SELECT VERSION()";
  
$ver mysql_query($query);
  if(!
$ver) exit("Ошибка при определении версии MySQL-сервера");
  
$version mysql_result($ver0);
  list(
$major$minor) = explode("."$version);
  
// Если версия выше 4.1 сообщаем серверу, что будем работать с
  // кодировкой cp1251
  
$ver $major.".".$minor;
  if((float)
$ver >= 4.1)
  {
    
mysql_query("SET NAMES `cp1251`");
  }
//Проверяем, на пустоту поле формы
$error "";
 if(empty(
$_POST[`name`]))    
 {
$error .=  "<p>Не введено искомое слово.
Введите поисковое слово и повторите поиск.</p>"
;
 }
else
{
//обрабатываем на предмет sql инъекций
  
if (!get_magic_quotes_gpc())
  {
    
$name mysql_escape_string($_POST[`name`]);
  }
else
{
$name $_POST[`name`];
}
//формируем поисковый запрос , в логическом режиме
$query "SELECT * FROM articles WHERE MATCH (name, description ) 
AGAINST (`
$name` IN BOOLEAN MODE)";
$post mysql_query($query);
 if(
$post)
        {
          
$numtot mysql_num_rows($post);
          if(
$numtot>0)
          {
$rezult "";
$rezult .= "<ol>";
while(
$posts mysql_fetch_array($post))
            {
$rezult .= "
<li><a href=`http://"
.$_SERVER[`SERVER_NAME`]."/
article/index.php?id_article= "
.$posts[`id_article`]."`>
"
$posts[`name`]."</a>
«..."
.$posts[`description`]."...»</li>";
        }
$rezult .= "</ol>";
        }
//если результата нет, выводим сообщение
else
{
$error .=  "<p>По поисковому запросу: ".$_POST[`name`].
ничего не найдено. Попробуйте изменить поисковое слово.</p>"
;

}
}
}
?>
<html><head><title>Search</title></head><body>
<div><form action="search.php" method="post">
<table style="margin-bottom: 0px;" width="100%" 
border="0" cellpadding="0" cellspacing="0">
<tr><td style="background-color:transparent;" valign="top" width="300">
<input  type="text" name="name" size="10" maxlength="40" 
style=" border:1px solid #000000; width:95%;" /></td>
<td width="50"><input type="Submit" name="send" value="искать" /></td></tr>
</table></form></div>
<?php
if(!empty($_POST[`send`]))

if(isset(
$error)) echo $error;
echo 
$rezult
}
?>
</body></html>


Партнеры

Valid HTML 4.01 Transitional