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