zoekmachine maken

Status
Niet open voor verdere reacties.

MegaByter

Terugkerende gebruiker
Lid geworden
11 okt 2009
Berichten
1.497
Hoi,

ik vroeg mij af hoe ik een zoekmachine maak voor mijn website.
En zon zoek machine die je kan afstemmen dat hij per pagina zoekt op mijn site.
 
Ik ben het met ecd eens. Omdat je, als je zelf een zoekmachine wilt maken, dit niet in HTML kan, en je verstand van PHP of een andere programeertaal moet hebben.
 
ja maar die van google kijkt naar het gehele domein.
ik zoek echt een zoekmachine die verfijnt zoekt. dus echt tot de laatste punt op een pagina.
 
ja maar die van google kijkt naar het gehele domein.
ik zoek echt een zoekmachine die verfijnt zoekt. dus echt tot de laatste punt op een pagina.

Een aangepaste zoekmachine maken zei:
Afzonderlijke pagina's: als u www.mijnsite.nl/mijnpagina.html opgeeft, wordt alleen de pagina mijnpagina.html op www.mijnsite.nl opgenomen.

Gehele sites: door www.mijnsite.nl/* op te geven, worden alle pagina's op www.mijnsite.nl opgenomen.

Delen van sites: u kunt wildcardpatronen gebruiken om alleen bepaalde delen van een site op te nemen. Met www.mijnsite.nl/*informatie* bijvoorbeeld, worden alleen bestanden op www.mijnsite.nl opgenomen die het woord informatie in de naam bevatten.

Gehele domeinen: u kunt aan de hand van *.mijndomein.nl ook een geheel domein opgeven. Als u mijndomein.nl opgeeft, veranderen we dit automatisch in *.mijndomein.nl/*. Als dit niet is wat u wilt, kunt u het in het configuratiescherm wijzigen.

Volgens mij klopt je opmerking niet.
 
zoals ik al zei, hij pakt hem niet.
ik heb het al meerder malen geprobeerd.
 
als je een geïntegreerde zoek machine wil hebben waarvan je de reseltaten ook kan opmaken enzo moet je er zelf een maken (of kopieren) door bijv. php.
Je website moet dan wel php ondersteunen.
Het is mogenlijk om het met een database te doen met al je pagina's met tags erbij, maar dat is erg veel werk (en niet zo makkelijk te kopieren en plakken).

Ik ben zelf op dit iedee gekomen: een eigen zoekmachine op meta tags. Je kan een voorbeeld hier bekijken.
ik heb het php script even niet bijdehand (kan ik vanavond posten).
het werkt simpel; je zet op elke pagina die je doorzocht wil hebben je meta tags neer bijvoorbeeld:
<title>pagina voor indexatie</title>
<META NAME="description" CONTENT="pagina met meta tags zodat hij word geïndexeert met ecross\' zoek machine">
<META NAME="keywords" CONTENT="pagina, meta, tags">
er word ook gezocht op de titel van de pagina.
 
als je een geïntegreerde zoek machine wil hebben waarvan je de reseltaten ook kan opmaken enzo moet je er zelf een maken (of kopieren) door bijv. php.
Je website moet dan wel php ondersteunen.
Het is mogenlijk om het met een database te doen met al je pagina's met tags erbij, maar dat is erg veel werk (en niet zo makkelijk te kopieren en plakken).

Ik ben zelf op dit iedee gekomen: een eigen zoekmachine op meta tags. Je kan een voorbeeld hier bekijken.
ik heb het php script even niet bijdehand (kan ik vanavond posten).
het werkt simpel; je zet op elke pagina die je doorzocht wil hebben je meta tags neer bijvoorbeeld:

er word ook gezocht op de titel van de pagina.

ecross, zou je dat script willen posten? dat zoek ik zelf ook nog namelijk:thumb:
 
het is nog niet helmaal af, hij zoekt nu alleen nog in de directorie (map) waar dit script is staat, dat wil ik nog aanpassen. onderaan probeerde ik ook de gezochte woorden dikgedrukt te maken maar dat lukt nog niet, ik ben ook nog bezig met dingen als " " om zoek woorden heen zetten enz.

PHP:
<html>
<head>
<title>zoek machine op meta tags + titels in eigen folder</title>
<meta name="keywords" content="zoek machine om mijn website te doorzoeken via meta tags zodat er geen database nodig is">
</head>
<body>
<h4>er word gezocht op de meta tags en titels van de bestanden in de directorie</h4>
<form action='<?php $_SERVER['SCRIPT_NAME'] ?>' method='GET'>
zoek woord: <input type='text' value='<?php $_GET['words'] ?>' name='words'><input type='submit' value='zoek!'>
</form>
<?php
$meta = array();
if ($handle = opendir('./')) { //kies eventueel een andere dir.
    /* This is the correct way to loop over the directory. */
    while (false !== ($file = readdir($handle))) {
        $description = (get_meta_tags($file)); // haal meta tags op + stop in $description
		$data = implode("", file($file));
		preg_match ("/<title>([^`]*?)<\/title>/", $data, $match); // haal de titel uit het bestand en stop het in match
		$titleofpage = $match[1];
		if (!empty($description)){
		array_push($description, $file); // stop de filenaam in $description.
		array_push($description, $titleofpage); // stop titel in $description
		array_push($meta, $description);} // stop array $description in array $meta (multidementionnaal)
		
    }
  closedir($handle);
}

$words = str_replace(" ", "|", $_GET['words']); // vervang spatie naar |
$search = "*".$words."*i";
foreach($meta as $number => $page){ // doorloop $meta
	if(preg_match($search, $page['keywords']) and preg_match($search, $page['1'])){ // als keywords (van meta tag) en de titel matchen met een van de ingevulde woorden
		$high .= "<p>"; // stop in $high 
		$high .= "<a href='".$page['0']."'>".$page['1']."</a><br>";
		$high .= $page['keywords']."<br>";
		$high .= $page['description'];
		$high .= "</p>";
		}
	elseif(preg_match($search, $page['keywords']) or preg_match($search, $page['1'])){ // als keywords (van meta tag) of de titel matchen met een van de ingevulde woorden
		$low .= "<p>"; // stop in $low
		$low .= "<a href='".$page['0']."'>".$page['1']."</a><br>";
		$low .= $page['keywords']."<br>";
		$low .= $page['description'];
		$low .= "</p>";
		}
	}
//$replace = "<b>".$_GET['words']."</b>"; /* werkt nog niet, zou de gezochte woorden dik gedrukt moeten maken */

if (isset($high)){ 
//str_replace($_GET['words'], $replace, $high); /* werkt nog niet, zou de gezochte woorden dik gedrukt moeten maken */
echo "beste hits:<br>".$high;}// laat eerst $high zien
if (isset($low)){ 
//str_replace($_GET['words'], $replace, $low); /* werkt nog niet, zou de gezochte woorden dik gedrukt moeten maken */
echo "hits:<br>".$low;}// en laat dan $low zien
if (!isset($high) and !isset($low)){
echo "er zijn geen hit op deze zoek term";}// als er niets in $high en $low zit
?>
 
en hier is nog een verbeterde versie die ook een map dieper zoekt en je kan ook een + gebruiken in je zoek term om naar meerdere woorden bij elkaar te zoeken.

PHP:
<html>
<head>
<title>zoek machine op meta tags + titels in eigen folder oud</title>
<meta name="keywords" content="zoek machine om mijn website te doorzoeken via meta tags zodat er geen database nodig is">

</head>
<body>
<h4>er word gezocht op de meta tags en titels van de bestanden in de directorie</h4>
<form action='<?php $_SERVER['SCRIPT_NAME'] ?>' method='GET'>
zoek woord: <input type='text' value='<?php echo $_GET['words'] ?>' name='words'><input type='submit' value='zoek!'>
</form>
<?php
$meta = array();
if ($handle = opendir('./')) { //kies eventueel een andere dir.
    /* This is the correct way to loop over the directory. */
    while (false !== ($file = readdir($handle))) {
	if (is_dir($file) and $file != '.' and $file != '..')
		{
		if ($handle2 = opendir($file)) {
			while (false !== ($file2 = readdir($handle2))) {
			$file2 = $file.'/'.$file2;
			$description = (get_meta_tags($file2)); // haal meta tags op + stop in $description
			$data = implode("", file($file2));
			preg_match ("/<title>([^`]*?)<\/title>/", $data, $match); // haal de titel uit het bestand en stop het in match
			$titleofpage = $match[1];
			if (!empty($description)){
				array_push($description, $file2); // stop de filenaam in $description.
				array_push($description, $titleofpage); // stop titel in $description
				array_push($meta, $description);} // stop array $description in array $meta (multidementionnaal)
				}
			}
		}
	else {
		$description = (get_meta_tags($file)); // haal meta tags op + stop in $description
		$data = implode("", file($file));
		preg_match ("/<title>([^`]*?)<\/title>/", $data, $match); // haal de titel uit het bestand en stop het in match
		$titleofpage = $match[1];
		if (!empty($description)){
			array_push($description, $file); // stop de filenaam in $description.
			array_push($description, $titleofpage); // stop titel in $description
			array_push($meta, $description); // stop array $description in array $meta (multidementionnaal)
			}
		}
    }
  closedir($handle);
}
$words = str_replace(" ", "|", $_GET['words']); // vervang spatie naar |
$words = str_replace("+", " ", $words);
$search = "*".$words."*i";
foreach($meta as $number => $page){ // doorloop $meta
	if(preg_match($search, $page['keywords']) and preg_match($search, $page['1'])){ // als keywords (van meta tag) en de titel matchen met een van de ingevulde woorden
		$high .= "<p>"; // stop in $high 
		$high .= "<a href='".$page['0']."'>".$page['1']."</a><br>";
		$high .= $page['keywords']."<br>";
		$high .= $page['description'];
		$high .= "</p>";
		}
	elseif(preg_match($search, $page['keywords']) or preg_match($search, $page['1'])){ // als keywords (van meta tag) of de titel matchen met een van de ingevulde woorden
		$low .= "<p>"; // stop in $low
		$low .= "<a href='".$page['0']."'>".$page['1']."</a><br>";
		$low .= $page['keywords']."<br>";
		$low .= $page['description'];
		$low .= "</p>";
		}
	}
//$replace = "<b>".$_GET['words']."</b>"; /* werkt nog niet, zou de gezochte woorden dik gedrukt moeten maken */

if (isset($high)){ 
//str_replace($_GET['words'], $replace, $high); /* werkt nog niet, zou de gezochte woorden dik gedrukt moeten maken */
echo "beste hits:<br>".$high;}// laat eerst $high zien
if (isset($low)){ 
//str_replace($_GET['words'], $replace, $low); /* werkt nog niet, zou de gezochte woorden dik gedrukt moeten maken */
echo "hits:<br>".$low;}// en laat dan $low zien
if (!isset($high) and !isset($low)){
echo "er zijn geen hit op deze zoek term";}// als er niets in $high en $low zit
?>
 
kijk hier kan ik wat mee :thumb:
heb ik weer even wat te doen.
dank je :thumb:
 
Ik zelf gebruik op m'n site een door mijn zoon geschreven php-script.
Deze zoekt alle ankers (<a name=....></a>) in de bestanden en plaatst ze in een MySql database. De resultaten verschijnen op een aparte pagina. (Voorbeeld)
Er zijn, als je kennis van het script hebt, diverse aanpassingen mogelijk.
De zoekmachine in het menu hier links stuurt je, als je in de woordenlijsten zoekt, direct naar de juiste plaats (mits gevonden).
Ik zelf vind het een geweldig script (maar ik begrijp er niet alles van) vandaar dat ik het even onder de aandacht breng.
 
Laatst bewerkt:
hoe zoekt hij dan naar de ankers voor in de database? (dat is voor mij het grootste pobleem)
kun je misschien het script posten?
 
Nu het mocht.

Gebruikte database tabellen:
Tabel ENTRY
velden: id, keyword*, group, url, anchor*
*keyword = woord in de tekst, anchor = bijbehorend anker. Noodzakelijk omdat bepaalde tekens niet in ankers voor mogen komen. Dit biedt trouwens ook de mogelijkheid om aan één woord meerdere ankers te hechten. Op mijn site wordt dat nogal eens gebruikt om op de diverse schrijfwijzes van een woord wel te kunnen zoeken, zonder dat ik die woorden ook echt in m'n tekst opneem.

Tabel GROUP
velden: id, naam, directory, recurse.
naam = afdeling waarin de keywords gevonden zijn. (Deze naam wordt gebruikt bij het tonen van de zoekresultaten.)
directory = de directory die doorzocht wordt.

Tabel URL
velden: id, location, title
location = adres van het bestand
title = titel van het bestand.


Het script dat alle ankers in de diverse bestanden verzamelt (en dat zijn er bij heel wat).
PHP:
<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01//EN">
<html>

	<head>
		<title>Indexer</title>
	</head>
	<body>
<?php

require_once "config.inc.php";

function ProcessFile($fname)
{
	global $db;
	global $group;
	

	$re_match_title = '<title>([^<]*)<\/title>';
	$re_match_anchor = '<a\s([^>]*)>';
	$re_match_name = 'name="([^"]*)"';

	$input = @file_get_contents($fname);
	if ($input === false) return 0;

	$title = '';
	if (preg_match("/{$re_match_title}/siU", $input, $matches)) { 
		if (isset($matches[1])) {
			$title = html_entity_decode($matches[1]);
		}
	}
	echo "<p>{$fname}</p>";
	$q = "SELECT id,location,title FROM url WHERE location='" . mysql_real_escape_string($fname, $db) . "';";
	$res = mysql_query($q, $db);
	if ($res === false) die(mysql_error($db));
	if (mysql_num_rows($res) == 0) {
		$q = 'INSERT INTO url (location, title) VALUES (\'' . mysql_real_escape_string($fname, $db) . '\', \'' . 
			mysql_real_escape_string($title, $db) . '\');';
		$res = mysql_query($q, $db);
		if ($res === false) die(mysql_error($db));

		$url_id = mysql_insert_id($db);
		if ($url_id === false)  die(mysql_error($db));
	} else {
		$row = mysql_fetch_assoc($res);
		$url_id = $row['id'];		
		if ($title != $row['title']) {
			$q = 'UPDATE url SET title=\'' . mysql_real_escape_string($title, $db) . "' WHERE id={$url_id};";
			$res = mysql_query($q, $db);
			if ($res === false) die(mysql_error($db));
		} 
	}
	
	$ftotal = 0;
	if (preg_match_all("/{$re_match_anchor}/siU", $input, $matches, PREG_SET_ORDER)) { 
		foreach ($matches as $match) {
			if (preg_match("/{$re_match_name}/siU", $match[1], $name)) {
				//echo "<a href=\"{$fname}#{$name[1]}\">{$name[1]}</a><br>";
				$pg_n = mysql_real_escape_string(str_replace('_', ' ', $name[1]), $db);
				$anchor = mysql_real_escape_string(($name[1]), $db);
				$q = 'INSERT INTO entry (keyword, `group`, url, anchor) '
					. " VALUES ('{$pg_n}', {$group}, {$url_id}, '{$anchor}');";
				if (mysql_query($q, $db) === false) {
					echo "error: {$q}";
					die(mysql_error($db));
				}
				++$ftotal;
			}
		}
	}
	return $ftotal;
}

function ScanDirs($dir, $callback, $recurse)
{
	$total = 0;
	echo "<h2>$dir</h2>";
	//$files  = scandir($dir);
	$dh  = opendir($dir);
	while (false !== ($filename = readdir($dh))) {
    	$files[] = $filename;
	}
	closedir($dh);
	foreach ($files as $filename) {
		if (in_array($filename, array('.', '..')) ) continue;
   		if (is_dir($dir . '/' . $filename)) {
   			if ($recurse) {
   				ScanDirs($dir . '/' . $filename, $callback, true);
   			}	
   		} else if (is_file($dir . '/' . $filename)){
			$pos = strrpos($filename, '.');
			if ($pos !== false) {
				$ext = substr($filename, $pos+1);
				if (($ext == 'html') OR ($ext == 'php')) {   			
					$total += $callback($dir . '/' . $filename);
				}// else echo "<p>$ext</p>";
			}   			
   		}
	}
	return $total;
}


$start = microtime(true);
$db = db_connect();
$res = mysql_query('SELECT * FROM `group`;', $db);
if ($res === false) die(mysql_error($db));
while ($row = mysql_fetch_array($res)) {
	echo "<h1>{$row['naam']}</h1>";
	print_r($row);
	// verwijder oude entries
	//$db->query('BEGIN;');
	mysql_query('DELETE FROM entry WHERE `group`=' . $row['id'] . ';', $db)
		|| die(mysql_error());
	$group = $row['id'];
	if ($row['directory'] == '') $dir =  '..';
	else $dir = '../' . $row['directory'];
	$tot = ScanDirs($dir, 'ProcessFile', $row['recurse']);
	echo "<p>Aantal keywords: {$tot}</p>";
	// scan en voeg nieuwe toe
	//$db->query('COMMIT;');
}

$time_elapsed = microtime(true) - $start;

/*
SELECT "group".naam, entry.keyword, url.location || '#' || entry.anchor
FROM entry,url,"group"
WHERE keyword='monohull' AND entry.url=url.id AND "group".id=entry."group";
 */
mysql_close($db);
?>
	<p><?php echo $time_elapsed ?> seconds</p>
	
	</body>
</html>

Vraag me niet van alles tekst en uitleg, want veel verder dan een eenvoudige functie reikt mijn kennis van PHP niet:(

Het script dat de zoekactie uitvoert en de resultaten toont, kunnen jullie vast wel zelf schrijven.
 
Laatst bewerkt:
ahah, de dir's staan in de database.
alleen waar is 'recurse' voor (zowel in de database als in het script)?
 
Het wel of niet doorlopen van de subdirectories (als ik het wel heb).
 
Laatst bewerkt:
Status
Niet open voor verdere reacties.
Terug
Bovenaan Onderaan