Volltextsuche über mehrere Tabellen

Volltextsuche über mehrere Tabellen

am 18.01.2006 18:08:07 von Daniel Wanitsch

Hallo zusammen

Ich brauche eine kleine Suchmaschine auf einem Shared Host.
Die Texte, die durchsucht werden sollen, sind in einer MySQL-DB,
jedoch auf mehrere Tabellen verteilt.
Soviel ich weiss, kann ich FULLTEXT nur auf je eine Tabelle anwenden,
was für die Suche ja Bedingung ist.
Ist es irgendwie möglich, trotzdem alle Tabellen zu durchsuchen, ohne die
Resultate getrennt nach Tabelle zu erhalten?
Lassen sich beispielsweise die gewichteten (Relevanz) Suchresultate
aller Tabellen zusammenfassen und dann ausgeben?

Danke für Anregungen und Tipps!

Gruss,

Daniel

PS: Entschuldigt, falls es eine Anfängerfrage ist, aber habe mich damit
erst seit kurzem befasst...

Re: Volltextsuche übermehrere Tabellen

am 18.01.2006 18:18:22 von Knut Kohl

Hallo,

Daniel Wanitsch schrieb am 18. Jan 2006 in de.comp.lang.php.datenbanken:

> Hallo zusammen

> Ich brauche eine kleine Suchmaschine auf einem Shared Host.
> Die Texte, die durchsucht werden sollen, sind in einer MySQL-DB,
> jedoch auf mehrere Tabellen verteilt.
> Soviel ich weiss, kann ich FULLTEXT nur auf je eine Tabelle anwenden,
> was für die Suche ja Bedingung ist.
> Ist es irgendwie möglich, trotzdem alle Tabellen zu durchsuchen, ohne die
> Resultate getrennt nach Tabelle zu erhalten?
> Lassen sich beispielsweise die gewichteten (Relevanz) Suchresultate
> aller Tabellen zusammenfassen und dann ausgeben?

1. select in temporäre Tabelle (Quelltabelle merken!), sortiert
ausgeben?
2. alle Ergebnisse in EIN Array (Quelltabelle merken!), sortieren
ausgeben?

Die Quelltabelle brauchst Du, wenn der User auf die Details des
Datensatzes verzweigen will.

Such dir was aus :-)

> Danke für Anregungen und Tipps!

> Gruss,

> Daniel

Knut


--

Newsoffice.de - Die Onlinesoftware zum Lesen und Schreiben im Usenet

Re: Volltextsuche über mehrere Tabellen

am 20.01.2006 15:52:58 von Daniel Wanitsch

"Knut Kohl" schrieb im Newsbeitrag news:1137604702.24@user.newsoffice.de...
> Hallo,
> 1. select in temporäre Tabelle (Quelltabelle merken!), sortiert ausgeben?
> 2. alle Ergebnisse in EIN Array (Quelltabelle merken!), sortieren ausgeben?
>
> Die Quelltabelle brauchst Du, wenn der User auf die Details des Datensatzes verzweigen will.
>
> Such dir was aus :-)

Ich habe mich für zweiteres entschieden :-)
Nun wäre ich noch froh um etwas Unterstützung... habe bisher folgendes
zusammengebastelt...
Zur Erklärung: $suche ist ein array der zu durchsuchenden Tabellen.
Leider klappt das unten nicht ganz so, wie ich es will... scheinbar wird immer
nur ein Wert pro Tabelle in das $result-array geschrieben. Muss ich irgendwo
noch ein array_merge einfügen bzw was sollte ich ändern?
Bin nicht so der Hirsch in Sachen arrays, sorry...

foreach($suche as $key => $wert)
{
$tabelle="".$_GET['lang']."_".$wert."";
$resultat=mysql_query("SELECT ID, MATCH ( `titel`, `text` ) AGAINST ( '".$_POST['string']."' ) FROM `$tabelle`");
if(@mysql_num_rows($resultat)>0)
{
$seite=array("tabelle"=>"$tabelle");
$result[$key]=array_merge($seite, mysql_fetch_array(mysql_query("SELECT ID, titel, MATCH ( `titel`, `text` ) AGAINST (
'".$_POST['string']."' ) FROM `$tabelle` ORDER BY titel"),MYSQL_ASSOC));
}
else
{
}
}

Hier geht es nicht mehr um Datenbanken, ich weiss... aber dachte als
Folgefrage ist es erlaubt :-)

Danke für Tipps und beste Grüsse

Daniel

Re: Volltextsuche übermehrere Tabellen

am 20.01.2006 19:40:57 von Knut Kohl

Hallo Daniel,

Daniel Wanitsch schrieb am 20. Jan 2006 in de.comp.lang.php.datenbanken:


> foreach($suche as $key => $wert)
> {
> $tabelle="".$_GET['lang']."_".$wert."";
> $resultat=mysql_query("SELECT ID, MATCH ( `titel`, `text` ) AGAINST (
> '".$_POST['string']."' ) FROM `$tabelle`");
> if(@mysql_num_rows($resultat)>0)
> {
> $seite=array("tabelle"=>"$tabelle");
> $result[$key]=array_merge($seite, mysql_fetch_array(mysql_query("SELECT
> ID, titel, MATCH ( `titel`, `text` ) AGAINST (
> '".$_POST['string']."' ) FROM `$tabelle` ORDER BY titel"),MYSQL_ASSOC));
> }
> else
> {
> }
> }

Vorab, Du mußt das Ergebnis durchlaufen und die Zeilen rausholen...

Aber ausführlich, erst mal aufräumen,

ich gehe davon aus, $_GET['lang'] und $_POST['string'] sind bereits
validiert...

foreach ($suche as $key => $wert) {
$tabelle = "$_GET[lang]_$wert";
$query = sprintf('"SELECT ID, titel, MATCH ( `titel`, `text` ) '
.'AGAINST ( "%s" ) as rang FROM `%s` ORDER BY titel',
$_POST['string'],$tabelle);
/* ORDER BY MATCH... DESC wäre zu auszuprobieren,
das liefert die Treffer nach Relevanz absteigend */
$resultat = mysql_query($sql);

if ($resultat && mysql_num_rows($resultat)) {
$seite = array("tabelle" => $tabelle);
while ($row = mysql_fetch_assoc($result)) $result[$key][] = $row;
} else {
/*
if (!$resultat)
else
*/
}
}

(nicht geparst, Syntaxfehler können noch drin sein ;-)

Allerdings weiß nix mit der Zuweisung an $seite anzufangen, da steht
immer die letzte Tabelle drin, die einen Treffer hatte.
Vielleicht: $seite[] = $tabelle;
Dann hast Du dieselbe Struktur wie in $suche, aber nur die
Treffertabellen.

Noch besser wäre
while ... $result[$wert][] = $row;
dann bekommst Du in der ersten Ebene die Treffertabellen und darunter
die jeweilgen Ergebniszeilen.

array(
'tabelle1' => array (
[0] => array ( 'ID' => ... ),
[1] => array ( 'ID' => ... )
),
'tabelle2' => array (
[0] => array ( 'ID' => ... ),
[1] => array ( 'ID' => ... )
)
)

> Hier geht es nicht mehr um Datenbanken, ich weiss... aber dachte als
> Folgefrage ist es erlaubt :-)

Gern geschehen.

> Danke für Tipps und beste Grüsse

> Daniel

Knut

--

Newsoffice.de - Die Onlinesoftware zum Lesen und Schreiben im Usenet

Re: Volltextsuche über mehrere Tabellen

am 22.01.2006 22:20:19 von Daniel Wanitsch

"Knut Kohl" schrieb im Newsbeitrag news:1137782457.59@user.newsoffice.de...
>
>
> (nicht geparst, Syntaxfehler können noch drin sein ;-)
>

Ein paar wenige, aber danke für alles!! ;-)

Eine letzte Frage:
Muss ich bei jeder solchen Suche nun alle Datensätze ausschliessen, die bei
'rang' einen Wert gleich Null haben?
Führt das nicht zu unnötigen Belastungen des Servers oder ist das hier
marginal?

Danke & beste Grüsse aus der Schweiz

Daniel Wanitsch

Re: Volltextsuche über mehrere Tabellen

am 23.01.2006 15:06:06 von dev-null-use-reply-adress

Daniel Wanitsch schrieb:
>
> Ich brauche eine kleine Suchmaschine auf einem Shared Host.
> Die Texte, die durchsucht werden sollen, sind in einer MySQL-DB,
> jedoch auf mehrere Tabellen verteilt.
> Soviel ich weiss, kann ich FULLTEXT nur auf je eine Tabelle anwenden,
> was für die Suche ja Bedingung ist.
> Ist es irgendwie möglich, trotzdem alle Tabellen zu durchsuchen, ohne die
> Resultate getrennt nach Tabelle zu erhalten?

Ich betreue ein Projekt mit ähnlicher Problematik. Die redaktionellen
Artikel sind auf zwei Tabellen verteilt und es existiert noch
ein Leserforum. Um alles in einer einfachen und schnellen Suche
zusammenzufassen, habe ich einfach eine extra Suchtabelle angelegt.
Etwas problematisch ist lediglich, diese aktuell zu halten - ging
aber letztendlich auch.
Wenn Speicherplatz kein allzu großes Problem darstellt, halte ich
diese Redundanz durchaus für sinnvoll.

Vielleicht geht das bei Dir ja auch.


Gruß
JPM

Re: Volltextsuche übermehrere Tabellen

am 23.01.2006 19:47:01 von Knut Kohl

Hallo Daniel,

Daniel Wanitsch schrieb am 22. Jan 2006 in de.comp.lang.php.datenbanken:

> "Knut Kohl" schrieb im Newsbeitrag
> news:1137782457.59@user.newsoffice.de...
>>
>>
>> (nicht geparst, Syntaxfehler können noch drin sein ;-)
>>

> Ein paar wenige, aber danke für alles!! ;-)

> Eine letzte Frage:
> Muss ich bei jeder solchen Suche nun alle Datensätze ausschliessen, die bei
> 'rang' einen Wert gleich Null haben?
> Führt das nicht zu unnötigen Belastungen des Servers oder ist das hier
> marginal?

Wenn Du das MATCH ... mit in das WHERE aufnimmst, werden die "0" nicht
mit zurückgegeben, das 0 == FALSE!

http://dev.mysql.com/doc/refman/4.1/en/fulltext-search.html

> Danke & beste Grüsse aus der Schweiz

> Daniel Wanitsch

Knut

--
fli4l-User #00001889
http://boinc.knutkohl.de/

/°\ --- JOIN NOW!!! ---
\ / ASCII ribbon campaign
X against HTML
/ \ in mail and news

Newsoffice.de - Die Onlinesoftware zum Lesen und Schreiben im Usenet