Volltextsuche

Volltextsuche

am 08.12.2005 22:59:53 von Jochen Wilberding

Hi zusammen,

ich versuche mich gerade an einer Volltextsuche.
In *einem* Textfeld möchte ich nach Begriffen (und-Verknüpfung) wie z.B.
'"Marc Chagall" Flötenspieler'
suchen.
Bisher habe ich das ganze via
$qry = "SELECT * FROM xyz WHERE"; // passt natürlich nicht ganz, aber...
$array = explode(" ", $Suchbegriff);
for($i = 0; $i < count($array); $i++) {
$qry .= " AND text LIKE '%$array[$i]%'";
}
erledigt. Leider fällt dabei das "Marc Chagall" durch das Raster und wird
zu den Suchbegriffen '"Marc' und 'Chagall"'. Das ganze findet in einer
kleinen MySQL-Umgebung (bis ca. 2000 DS mit durchschnittlich 200 Byte Text)
statt. Also ist es letztlich (für die Performance) egal, welchen
Algorithmus ich verwende.
Am liebsten wäre mir ein regulärer Ausdruck für preg_split. Oder zumindest
der Weg zu einem solchen Ausdruck.
Alternativ käme für mich der Weg über endlose Schleifen und Bedingungen wie
if (substr($text, $i, 1) == '"')
$anfang_Hochkomma = true
while (!ende_Hochkomma) ...
in Frage.
Und das ist weder spassig noch fehlerresistent.

Gibt es dafür irgendwelce Standardroutinen, oder kocht auch hier jeder sein
eigenes Süppchen?


bis die tage
jochen

--
PS: bitte melden Sie sich, wenn Sie diese Nachricht NICHT erhalten haben!

Re: Volltextsuche

am 08.12.2005 23:15:34 von Johannes Vogel

Hi Jochen

Jochen Wilberding wrote:
> ich versuche mich gerade an einer Volltextsuche.
> In *einem* Textfeld möchte ich nach Begriffen (und-Verknüpfung) wie z.B.
> '"Marc Chagall" Flötenspieler'
> suchen.
(...)
> Gibt es dafür irgendwelce Standardroutinen, oder kocht auch hier jeder
> sein eigenes Süppchen?

Du willst dich wohl mit der Volltextsuche von MySQL befassen:
http://dev.mysql.com/doc/refman/5.0/en/fulltext-search.html

Ich glaube, die kann schon fast alles, was du hier machen möchtest und
ist auch für mehr als 2000 DS perfomant.

HTH, Johannes

Re: Volltextsuche

am 08.12.2005 23:19:44 von Jochen Wilberding

Johannes Vogel schrieb:

>> Gibt es dafür irgendwelce Standardroutinen, oder kocht auch hier jeder
>> sein eigenes Süppchen?
>
>
> Du willst dich wohl mit der Volltextsuche von MySQL befassen:
> http://dev.mysql.com/doc/refman/5.0/en/fulltext-search.html
>
> Ich glaube, die kann schon fast alles, was du hier machen möchtest und
> ist auch für mehr als 2000 DS perfomant.

Im Prinzip ja, aber IMHO ist das mit dem sub-Suchbegriff x x in '"x x" abc'
nicht möglich. Oder habe ich da was gravierendes übersehen?


bis die tage
jochen

--
PS: bitte melden Sie sich, wenn Sie diese Nachricht NICHT erhalten haben!

Re: Volltextsuche

am 08.12.2005 23:27:21 von Johannes Vogel

Hi Jochen

Jochen Wilberding wrote:
> Johannes Vogel schrieb:
>>> Gibt es dafür irgendwelce Standardroutinen, oder kocht auch hier
>>> jeder sein eigenes Süppchen?
>> Du willst dich wohl mit der Volltextsuche von MySQL befassen:
>> http://dev.mysql.com/doc/refman/5.0/en/fulltext-search.html
>> Ich glaube, die kann schon fast alles, was du hier machen möchtest und
>> ist auch für mehr als 2000 DS perfomant.
> Im Prinzip ja, aber IMHO ist das mit dem sub-Suchbegriff x x in '"x x"
> abc' nicht möglich. Oder habe ich da was gravierendes übersehen?

Ja, ich denke du hast den Boolean Mode übergesehen:
http://dev.mysql.com/doc/refman/5.0/en/fulltext-boolean.html

'"some words"'
Find rows that contain the exact phrase “some words” (for example, rows
that contain “some words of wisdom” but not “some noise words”). Note
that the ‘"’ characters that surround the phrase are operator characters
that delimit the phrase. They are not the quotes that surround the
search string itself.

HTH, Johannes

Re: Volltextsuche

am 08.12.2005 23:49:50 von Jochen Wilberding

Johannes Vogel schrieb:

Hi Johannes,

>> Im Prinzip ja, aber IMHO ist das mit dem sub-Suchbegriff x x in '"x x"
>> abc' nicht möglich. Oder habe ich da was gravierendes übersehen?
>
>
> Ja, ich denke du hast den Boolean Mode übergesehen:
> http://dev.mysql.com/doc/refman/5.0/en/fulltext-boolean.html
>
> '"some words"'
> Find rows that contain the exact phrase “some words” (for example, rows
> that contain “some words of wisdom” but not “some noise words”). Note
> that the ‘"’ characters that surround the phrase are operator characters
> that delimit the phrase. They are not the quotes that surround the
> search string itself.

du hast recht, das Suchergebnis stimmt. Den Boolean-Mode habe ich zwar im
Tut gesehen abere als irrelevant abgetan...
Nur, wie bekomme ich jetzt innerhalb des Ergebnisses meine Suchbegriffe
vorgehonen angezeigt?
Na ja, hast recht. *Das* war eigentlich nicht meine Frage ;-) .


bis die tage
jochen

--
PS: bitte melden Sie sich, wenn Sie diese Nachricht NICHT erhalten haben!

Re: Volltextsuche

am 09.12.2005 00:22:10 von Johannes Vogel

Hi Jochen

Jochen Wilberding wrote:
> Nur, wie bekomme ich jetzt innerhalb des Ergebnisses meine Suchbegriffe
> vorgehonen angezeigt?
> Na ja, hast recht. *Das* war eigentlich nicht meine Frage ;-) .

Als erstes ging es darum, die Einträge zu finden und zu ordnen. Dieses
Problem ist mit dem Fulltext-Search gelöst. Nun kannst du diese auslesen
lassen und mittels einer regexp formatieren.

Dies kannst du nun bspw. in verschiedenen Durchläufen durch Parsing des
Strings erledigen. Das lässt sich beliebig erweitern.

/-----------[ungetestet, soll nur als Ansatz dienen]--------------------
preg_match_all('#"(.*?)"#', $query, $words1); // alle ""-Strings
$query = preg_replace('#".*?"#', '', $query); // alle ""-Strings löschen
$words2 = split(' ', $query); // Wörter auslesen
$words = array_merge($words1, $words2); // Beide Listen mergen

while (list(...,$comment,...) = mysql_fetch_array(...)) {
$comment = preg_replace('#(.{10})('.implode('|',$words).')(.{10})#',
'...\\1\\2\\2...', $comment);
}
\----------------------------------------------------------- -------------

Probleme, die hier unberücksicht sind:
- Wörter, die | enthalten werden Probleme verursachen.
- +/- zu Beginn von Wörtern müssten berücksicht werden.
- * am Ende von Wörtern als Platzhalter
usw....

HTH, Johannes