|
|
|
| Не знаю, в тему ли... :)
Сложно ли организовать поиск по сайту самостоятельно?
Уже замучился... :)) | |
|
|
|
|
|
|
|
для: Sasha
(07.05.2005 в 19:56)
| | Смотря, какая структура у сайта. Да и еще сложность зависит от того, где находиться основная информация.
Если нужно сделать простой поиск по словам в статьях, хранящихся в базе данных, где есть название статьи. То нет, не сложно : ) | |
|
|
|
|
|
|
|
для: Artem S.
(07.05.2005 в 20:46)
| | а можно написать скрипт-паук как яндекс. Я на этом форуме выкладывал исходник. Такой подход хорош тем, что без разницы откуда инфа берется :) | |
|
|
|
|
|
|
|
для: JIEXA
(07.05.2005 в 20:57)
| | Вот этот исходник о котором рассказывал JIEXA:
CREATE TABLE search_index (
uri varchar(255) NOT NULL default '',
title text NOT NULL,
description text NOT NULL,
text mediumtext NOT NULL,
UNIQUE KEY (uri),
FULLTEXT KEY (text)
) TYPE=MyISAM;
Паук:
<?php
$indexed=array(); // массив, где мы отмечаем уже проиндексированные страницы
// $uri - стартовый адрес
function spider($uri='/', $depth=0){
global $indexed;
// URI уже проиндексирован, пропускаем
if($indexed[$uri]) return;
// удаляем из кэша старую версию рассматриваемого URI
mysql_query("delete from search_index where uri='".mysql_real_escape_string($uri)."'");
// формируем URL для вызова страницы сайта по HTTP
$url='http://'.$_SERVER["HTTP_HOST"].$uri;
// берем мета-теги. Для упрощения работы у нас сайт заголовок записывает не только в <title>, то и <meta name="title">
$meta=@get_meta_tags($url);
// либо ошибка, либо не документ. Пропускаем
if(!$meta) return;
// тут еще один момент для оптимизации. Мы 2 раза запрашиваем страницу, т. к. get_meta_tags не может работать со строкой, только с файлом. Можно один раз вызвать страницу по HTTP и сохранить в локальный файл.
$content=file_get_contents($url);
// чистим контент от тегов и html-entity (и заодно от повторяющихся пробелов)
$text=preg_replace('/(s+)|(&[a-zA-Z0-9#]+;)/', ' ', strip_tags($content));
// записываем данные по URI в индекс
mysql_query("insert into search_index set
uri='".mysql_real_escape_string($uri)."',
title='".mysql_real_escape_string($meta['title'])."',
description='".mysql_real_escape_string($meta['description'])."',
text='".mysql_real_escape_string($meta['title']."
".$page['description']."
".$text)."'");
// отмечаем в массиве, что этот URI мы проиндексировали
$indexed[$uri]=true;
// теперь делаем обход ссылок
// тут опять поле для оптимизаторства: мы здесь удаляем все теги кроме <A> и выбираем все, что идет после href= и заключено в двойные или одинарные кавычки
if($depth<3){
// если мы не слишком глубоко углубляемся в рекурсию
$links=split("href=",strip_tags($content,'<a>'));
foreach($links as $link){
$f=substr($link,0,1);
$link=substr($link,1);
if($f=='"' || $f=="'"){
$link=substr($l,0,strpos($link,$f));
// пропускаем ссылки, начинающиеся на http://, javascript: и пр.
if(strpos($link,'http://')===0 || strpos($link,'https://')===0 || strpos($link,'javascript:')===0 || strpos($link,'mailto:')===0 || strpos($link,'#')===0) continue;
}else{
//пропускаем ссылки без кавычек
continue;
}
// приводим ссылку к абсолютному виду
// тут тоже можно пооптимизировать
$diez=strpos($link,'#');
if($diez!==null){
$link=substr($link,0,$diez);
}
if(substr($link,0,1)!='/'){
$link=$uri.$link;
}
// рекурсивный вызов паука на очередную ссылку
spider($link, $depth+1);
}
}
}
// начальный вызов паука на корень сайта. Можно начинать его работу, например, и с карты сайта.
spider('/');
// оптимизируем таблицу индекса, а то она знатно раздувается.
db_query('optimize table search_index');
?>
|
| |
|
|
|
|
|
|
|
для: ZC
(07.05.2005 в 22:41)
| | :))
Вы меня переоцениваете!
Поиск в общем-то поиск по небольшому сайту 5-30 страничек html с разнообразной инфой...которую нужно находить и показывать где она, что-то типа этого... :)
А, что можно сделать с пауком конкретнее. Он всё проиндексирует и сложит. А как это достать поиском. И ещё - надо, чтоб индексировался только мой сайт, не выходя на внешние ссылки...или в нём это уже есть
$links=split("href=",strip_tags($content,'<a>'));
foreach($links as $link){
$f=substr($link,0,1);
$link=substr($link,1);
if($f=='"' || $f=="'"){
$link=substr($l,0,strpos($link,$f));
// пропускаем ссылки, начинающиеся на http://, javascript: и пр.
|
? | |
|
|
|
|
 15.6 Кб |
|
|
для: Sasha
(07.05.2005 в 22:52)
| | Нашёл в сети такую штуку, для организации поиска по сайту, у кого будет время и интерес, глянте... | |
|
|
|
|
|
|
|
|
для: cheops
(08.05.2005 в 00:22)
| | http://www.softtime.ru/forum/read.php?id_forum=1&id_theme=148
Насколько я понимаю, для поиска нужно создать список ключевых слов и ID страниц где они находятся, затем всё засунуть в БД и искать в ней?
Затем выводить страницу, подсвечивая найденное...
Это здорово, примерно то, что надо!
Но вот как это осуществляется?
Теперь поиск можно осуществлять примерно следующим образом:
<?php
SELECT id FROM base
WHERE MATCH(text) AGAINST('искомое слово');
-- или
SELECT id FROM base
WHERE MATCH(text) AGAINST('искомое') AND
MATCH(text) AGAINST('слово');
-- или
SELECT id FROM base
WHERE MATCH(text) AGAINST('искомое') OR
MATCH(text) AGAINST('слово');
|
Это что-то не понятно....это и есть поисковик ?
Про вариант поиска в буфере я что-то не совсем понял, что засовывается в буфер, 10 страниц? | |
|
|
|
|
|
|
|
для: Sasha
(08.05.2005 в 16:14)
| | Это непонятное полнотекстовый поиск: text - это столбец, проиндексированный индексом FULLTEXT, а аргумент ключевого слова AGAINST - искомое слово.
В буффере уже не поиск осуществляется а подсветка искомых слов. | |
|
|
|
|
|
|
|
для: cheops
(08.05.2005 в 17:59)
| | 1) Будет ли это работать с HTML ?
2) Я так понял, что в результате пользователю выдаётся страница с подсвеченными ключевыми словами. А если слова на нескольких страницах? | |
|
|
|
|
|
|
|
для: Sasha
(08.05.2005 в 19:44)
| | 1) Нет полнотекстовый поиск работает только с текстом помщённым в базу данных, так как это SQL-код.
2) Хм... но ведь посетитель, для того, чтобы просмотреть страницу должен её открыть? Вот тут ключевые слова и подсвечиваются. | |
|
|
|
|
|
|
|
для: cheops
(09.05.2005 в 00:22)
| | 1) А, что можно сделать с html, какие варианты организации поиска есть, вот например со скриптом-поисковиком предложенным выше...
2)Наверное это не самый лучший вариант, когда нужно обходить страницы, ищя подсвеченные слова :)) | |
|
|
|
|
|
|
|
для: Sasha
(09.05.2005 в 12:51)
| | Никаких идей нету ? | |
|
|
|
|
|
|
|
для: Sasha
(09.05.2005 в 12:51)
| | Если страниц мало, то можно просто забить их адреса в масси и при поиске просто открывать их, читать и искать информацию при помощи строковых функций, регулярных выражений. | |
|
|
|
|
|
|
|
для: cheops
(10.05.2005 в 13:28)
| | Страниц мало 3 группы по 5 страниц. поиск только внутри группы страниц.
информация расположена в ячейках таблицы, возможно ли, чтоб в результате поиска была страница с ячейками табл. в которых были ключевые слова?
Или в результате будут только адреса страниц? | |
|
|
|
|
|
|
|
для: Sasha
(10.05.2005 в 14:16)
| | Сначала будут только адреса, затем следует работать с самим файлом, как много в нём информации? | |
|
|
|
|
|
|
|
для: cheops
(11.05.2005 в 12:10)
| | Информации?
Весь html код занимает то 5 до 10 кб. | |
|
|
|