Форум: Форум PHPФорум ApacheФорум Регулярные ВыраженияФорум MySQLHTML+CSS+JavaScriptФорум FlashРазное
Новые темы: 0000000
Программирование. Ступени успешной карьеры. Авторы: Кузнецов М.В., Симдянов И.В. PHP 5/6. В подлиннике. Авторы: Кузнецов М.В., Симдянов И.В. Самоучитель MySQL 5. Авторы: Кузнецов М.В., Симдянов И.В. Самоучитель PHP 5 / 6 (3 издание). Авторы: Кузнецов М.В., Симдянов И.В. MySQL на примерах. Авторы: Кузнецов М.В., Симдянов И.В.
ВСЕ НАШИ КНИГИ
Консультационный центр SoftTime

Форум PHP

Выбрать другой форум

 

Здравствуйте, Посетитель!

вид форума:
Линейный форум Структурный форум

тема: Поиск по сайту...
 
 автор: Artem S.   (31.07.2004 в 23:22)   письмо автору
 
 

Нельзя ли объяснить общий принцип организации поиска.
Есть догадки.
Сайт допустим организован так
<?php
//.........(что там еще)........
include ("top.php");
include (
"menu.php");
include (
"text.php");
include (
"bottom.php");
//.........(что там еще)........
?>

Поиск по содержимому всех файлов. Если есть схожие слова, то формируется файл с содержанием ссылок на эти файлы, где они так же include("need_file.php") вместо text.php
Неужели все так грубо???

P.S. Надеюсь некого не запутал

   
 
 автор: cheops   (31.07.2004 в 23:34)   письмо автору
 
   для: Artem S.   (31.07.2004 в 23:22)
 

У нас-то обычно конетент динамический из базы и мы просто осуществляем поиск по базе данных...
А в файловом варианте обычно поступают проще, просто задерживают вывод, помещая контент в буффер и ищут в нём. Например,
<?php
  
// Весь вывод направляем в буффер
  
ob_start();
  
//.........(что там еще)........ 
  
include ("top.php"); 
  include (
"menu.php"); 
  include (
"text.php"); 
  include (
"bottom.php"); 
  
//.........(что там еще)........
  // занесение содержимого буфера в переменную
  
$buffer ob_get_contents();
  
// очищение буфера вывода и отключение буферизации вывода
  
ob_end_clean();
  
/////////////////////////////////////////////////////////////////
  // Вот тут осуществляется поиск и если необходимо
  // изменяем вид страницы в переменной $buffer
  // например заменяем искомые слова жирным
  /////////////////////////////////////////////////////////////////
  // вывод страницы
  
echo $buffer;
?>

   
 
 автор: Artem S.   (01.08.2004 в 13:06)   письмо автору
 
   для: cheops   (31.07.2004 в 23:34)
 

А как осуществлять поиск по базе данных?
Допустим, я специально создал таблицу, с 2 полями "id" и "text"
Как мне произвести поиск?

   
 
 автор: cheops   (01.08.2004 в 15:54)   письмо автору
 
   для: Artem S.   (01.08.2004 в 13:06)
 

Ну... база данных MySQL, да?
Будем для простоты считать, что каждый id соответствует отдельной странице, которую можно вывести, обратившись по ссылке index.php?id=45, где 45 – номер записи, сама таблица пусть называется base. Есть два подхода для поиска в текстовых полях:
1) Использование оператора LIKE, который ищет похожие слова

SELECT id FROM base WHERE text LIKE 'искомое слово';

Этот запрос вернёт id записи только в том случае, если поле text будет в точности равно фразе "искомое слово". Кроме этого при поиске можно использовать шаблоны: символ подчёркивания соответствует одному любому символу _, а символ процента % любому количеству символов, так запрос

SELECT id FROM base WHERE text LIKE '%искомое слово%';
 

Будет искать фразу "искомое слово" в любом тексте, например, этому запросу удовлетворяет запись "В таблице обязательно должно присутствовать искомое слово, иначе запись не будет возвращена". Оператор NOT LIKE, наоборот, возвращает записи только в том случае, если они не удовлетворяют искомой фразе.
Этот стандартный поиск средствами SQL, который должен работать во всех базах данных, но он больше подходит для небольших текстовых записей, вроде имени, адреса и т.д. Для объёмных записей, например, постов форума, больше применим второй способ.
2) Второй способ основан на полнотекстовом поиске по полям типа TEXT (он не является стандартом SQL и относится к расширениям MySQL). Для того чтобы воспользоваться полнотекстовым поиском, необходимо создать индекс FULLTEXT по полю text таблицы base (этот индекс в настоящее время поддерживается только для таблиц MyISAM). Для того, чтобы в уже созданную таблицу добавить индекс можно воспользоваться оператором ALTER:

ALTER TABLE base ADD FULLTEXT (text);
?>

Теперь поиск можно осуществлять примерно следующим образом:
<?php
SELECT id FROM base 
WHERE MATCH
(textAGAINST('искомое слово');
-- 
или
SELECT id FROM base 
WHERE MATCH
(textAGAINST('искомое') AND
MATCH(textAGAINST('слово');
-- 
или 
SELECT id FROM base 
WHERE MATCH
(textAGAINST('искомое') OR
MATCH(textAGAINST('слово');

Особенностью полнотекстового поиска по ключу FULLTEXT, является то, что игнорируются так называемые "общеупотребительные" слова. К ним относятся слова, состоящие меньше чем из четырёх символов или встречающиеся в более чем половине записей таблицы.
Кроме этого, начиная с версии 4.0.1 поддерживается так называемый "логический" режим поиска, позволяющий осуществлять "тонкую" настройку поиска.

После того, как запрос выполнен, можно выводить ссылки на найденные страницы, вот примерная схема:
<?php
  $query 
"…"// Запрос по первому или второму варианту
  
$pgs mysql_query($query);
  if(!
$pgs)
  {
     echo 
"Ошибка в синтаксисе запроса";
     exit();
  }
  
// Если результат поиска не пуст выводим ссылки на статьи
  
if(mysql_num_rows($pgs)>0)
  {
     while(
$id mysql_fetch_array($pgs))
     {
        echo 
"<a href=index.php?id=$id>статья</a><br>";
     }
  }
?>


PS В таблицу наверное стоит добавить ещё одно текстовое поле title для названия страницы, тогда его можно подставлять вместо слова "статья" в цикле while.

   
 
 автор: Artem S.   (01.08.2004 в 16:02)   письмо автору
 
   для: cheops   (01.08.2004 в 15:54)
 

Спасибо, скоро попробую. Если что с вопросами к вам =)

   
 
 автор: Адоп Акробат   (21.09.2004 в 15:05)   письмо автору
 
   для: cheops   (01.08.2004 в 15:54)
 

cheops а можно допустим зделать чтобы "искомое слово" искалось как и искать,поиск,искалось,слова...???

Я такое на одном сайте видел

   
 
 автор: cheops   (21.09.2004 в 16:42)   письмо автору
 
   для: Адоп Акробат   (21.09.2004 в 15:05)
 

Не понял, что требуется...

   
 
 автор: Адоп Акробат   (21.09.2004 в 18:36)   письмо автору
 
   для: cheops   (21.09.2004 в 16:42)
 

Чтобы он искал и похожие слова тоже

   
 
 автор: cheops   (21.09.2004 в 19:44)   письмо автору
 
   для: Адоп Акробат   (21.09.2004 в 18:36)
 

Если поиск осуществляется при помощи оператора LIKE, то этого эффекта можно добится при помощи запроса
SELECT id FROM base WHERE text LIKE '%иском%' OR text LIKE '%слов%'; 

При полнотекстовом поиске по индексам FULLTEXT поиск следует осуществлять в логическом режиме (IN BOOLEAN MODE):
SELECT id FROM base 
WHERE MATCH(text) AGAINST('иском*' IN BOOLEAN MODE) OR 
MATCH(text) AGAINST('слов*' IN BOOLEAN MODE); 

   
 
 автор: Адоп Акробат   (21.09.2004 в 19:47)   письмо автору
 
   для: cheops   (21.09.2004 в 19:44)
 

Спасибо очень пригодится :)

   
 
 автор: s1271tvg   (21.09.2004 в 13:28)   письмо автору
 
   для: cheops   (31.07.2004 в 23:34)
 

Можно поподробнее про поиск по сайту в варианте с файлами. Или где про ето прочитать можно. Вдруг внезапно это стало очень нужно.
А если нужно искать и по файлам и по базе то каким боком все это реализовывается.
Заранее спасибо.

   
 
 автор: cheops   (21.09.2004 в 16:55)   письмо автору
 
   для: s1271tvg   (21.09.2004 в 13:28)
 

Организация поиска в файловом варианте осуществляется следующим образом - открываются файлы html или php, содержащие текстовую информацию в их содержимом осуществляется поиск ключевых слов. Формируется список найденых ссылок. При переходе по ссылке вывод в окно браузера задерживается (как показано во втором посте) и при помощи регулярных выражений присходит подсветка ключевого слова на странице, например, за счёт замены в строке $buffer ключевого слова на ключевое слово обрамлённое тэгами <b></b>.

   
 
 автор: s1271tvg   (22.09.2004 в 06:06)   письмо автору
 
   для: cheops   (21.09.2004 в 16:55)
 

Спасибо что нибудь попробую.

   
 
 автор: s1271tvg   (22.09.2004 в 14:11)   письмо автору
 
   для: cheops   (21.09.2004 в 16:55)
 

Вроде сделал, причем даже что то заработало. Огромное спасибо.

   
Rambler's Top100
вверх

Rambler's Top100 Яндекс.Метрика Яндекс цитирования