Zum Inhalt springen

indexed_search Garbage Collector

Erstellt am 28. Oktober 2004 · 2 Antworten · letzte Antwort am 28. Oktober 2004

Tags: PHP, Suche, Tipp

afoeder ·

Hallihallo!

bei der indexed search engine bin ich auf ein Problem gestoßen. Ändert man den Seitentitel einer bereits indizierten Seite, erscheint bei der Suchabfrage immer noch der alte Seitentitel, für wer weiß wie lange. Da das typo3 die Seite nicht neu indiziert.

Ich habe ein php-script geschrieben, das raussucht, welche Seitentitel nicht mehr mit den indizierten Seitentiteln übereinstimmen, diese anzeigt und dann bei Bedarf aus den indexed_search-Tabellen löscht.

Ich habe das Ding nach bestem Wissen und Gewissen codiert, habe es natürlich auf meinem Web durchgeführt und es hat den erwünschten Erfolg gebracht. Es hat nix kaputt gemacht, nix versaut, es hat genau das getan, was es tun sollte: in der Suchabfrage erscheinen nun die neuen Seitentitel.
Dennoch übernehme ich natürlich keine Verantwortung und empfehle aus Sicherheitsgründen dieses Script nur erfahrenen PHP-Programmierern, die sich den Code ansehen und beurteilen können.
also: Keine Gewährleistung...

so, das war der Disclaimer :-)

der code ist hier (eine einzige Seite):

<?php
//Typo3 Pfad, per Web, also z.B. http://www.mypage.de/ (letzten / nicht vergessen!)
$t3WebPath = "http://www.mypage.de/";

$host = "localhost";
$user = "XXXXXX";
$PW = "YYYYYYYY";
$db = @mysql_pconnect($host,$user,$PW) or die ("Connection to DB failed!");
mysql_select_db("typo3_db",$db);
?>
<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Strict//EN"
	"http://www.w3.org/TR/xhtml1/DTD/xhtml1-strict.dtd">

<html>
<head>
	<title>indexed_search Garbage Collector</title>
<style type="text/css">
body, td{font-family:Verdana,Arial; font-size:8pt;}

td,th { border: solid 1px black; }

input.cmdButton
	{
		font-family:Verdana,Arial;
		font-weight:bold;
		cursor:hand;
		font-size:8pt;
	}
</style>
</head>

<body>
<?php
//wenn Formular übermittelt wurde, dann löschen und re-indexen...
if(isset($_POST["action"]) AND isset($_POST["ToDeletePhashes"]) AND "DeleteAndReindex" == $_POST["action"])
	{
		echo "<h3>Löschen der Datensätze</h3>";
		$strSQLphashes = join(" OR phash = ", $_POST["ToDeletePhashes"]);
		
		//Liste der Tabellen, aus denen die entsprechenden phashes gelöscht werden sollen...
		$arrTableNames = array("index_fulltext", "index_phash", "index_grlist", "index_rel", "index_section");
		
		for($i=0; $i<count($arrTableNames); $i++)
			{
				$query = "delete from " . $arrTableNames[$i] . " where phash = " . $strSQLphashes;
				echo "<b>Running query:</b><br />" . $query . "<br /><br />";
				mysql_query($query);
			}
		
		for($i=0; $i<count($_POST["ToReindexPids"]); $i++)
			{
				$t3Link = $t3WebPath . "index.php?id=" . $_POST["ToReindexPids"][$i];
				
				echo "<b>Opening page for reindexing:</b><br />" . $t3Link . "<br />";
				
				if(fopen($t3Link, "r")) echo "<i style="color:green;">successfully opened.</i>"; else echo "<i style="color:red;">error opening.</i>";
				
				echo "<br /><br />";
			}
	}
?>
<h3>indexed_search Garbagecollector</h3>
Folgende Seiten stimmen nicht mehr mit dem tatsächlichen Titel überein:<br />
<form action="<?php echo $_SERVER["PHP_SELF"]; ?>" method="post">
<input type="hidden" name="action" value="DeleteAndReindex" />
<table border="0" cellspacing="0" cellpadding="4" style="border-collapse:collapse;">
	<tr>
		<th>phash</th>
		<th>PageID</th>
		<th>Tatsächl. Seitentitel</th>
		<th>Indizierter Seitentitel</th>
	</tr>
<?php
$query = "select
						index_phash.phash,
						pages.uid as PageID,
						pages.title as PageTitle,
						index_phash.item_title as IndexedTitle
					from
						pages, index_phash, index_section
					where
						pages.title <> index_phash.item_title
						AND index_section.page_id = pages.uid
						AND index_section.phash = index_phash.phash
					order by PageID asc";
$result = mysql_query($query);

if(!mysql_num_rows($result))
	{
		echo "<tr align="center"><td colspan="4">*** keine fehlerhaften Dokumente gefunden ***</td></tr>
";
	}

while($row = mysql_fetch_array($result))
	{
		echo "<tr>
";
		echo "<td><input type="hidden" name="ToDeletePhashes[]" value="" . $row["phash"] . "" />" . $row["phash"] . "</td>
";
		echo "<td><input type="hidden" name="ToReindexPids[]" value="" . $row["PageID"] . "" />" . $row["PageID"] . "</td>
";
		echo "<td>" . $row["PageTitle"] . "</td>
";
		echo "<td>" . $row["IndexedTitle"] . "</td>";
		echo "</tr>
";
	}
?>
</table>
<?php if(mysql_num_rows($result)) { ?>
		<br />
		Diese Einträge können nun aus der Indizierungstabelle entfernt und neu indiziert werden. <input type="submit" value="OK" class="cmdButton" />
<?php } ?>
</form>
</body>
</html>

Grüße und viel Spaß,

adrian

barthel ·
afoeder schrieb

Ich habe ein php-script geschrieben, das raussucht, welche Seitentitel nicht mehr mit den indizierten Seitentiteln übereinstimmen, diese anzeigt und dann bei Bedarf aus den indexed_search-Tabellen löscht.

Der nächste Schritt wäre ein kleines Backend Extension 🙂

afoeder ·

Der nächste Schritt wäre ein kleines Backend Extension

ja, das stimmt...
aber das musste jetzt quick&dirty gehen, weil relativ dringend... und in BE-Extensions-schreiben müsste ich mich dann erst noch einarbeiten.

gruß,
adrian