Michael Schröpl: Lokale Suchmaschine

Beitrag lesen

Hi Andreas,

Ich habe im Prinzip 2 Möglichkeiten, wenn ich
Phrasensuche ermöglichen will:

  1. Mache ich das mit einer eigenen Index-Tabelle

das schaffst Du nicht. Ein Text enthält eine Anzahl
von Worten, die proportional zur Länge des Textes
ist (egal, ob Du diese Länge in Worten oder Bytes
oder ... mißt).
Aber die Anzahl der darin enthaltenen Phrasen nimmt
exponentiell mit der Länge des Textes zu.

  1. oder ich mache einfach so viele einzelne Abfragen
    nacheinander wie Worte in der Suche vorkommen über
    die besagten Fulltext-Index Spalten.

Das reicht noch nicht. Damit findest Du zwar Texte,
in denen alle Worte vorkommen, die auch in der Phrase
vorkommen - aber sie müssen nicht in genau der
Anordnung vorkommen, wie sie in der Phrase stehen.

Das hört sich zwar nicht wirklich vernünftig an,
aber wie viele Leute suchen nach mehr als 3,4
Wörtern?

Es ist schlimm genug, wenn sie nach 4 Worten suchen.
Du bekommst dann nämlich vier Treffermengen, die Du
erst mal zwischenspeichern und schneiden mußt ...
und jede dieser Mengen kann tausende von Elementen
enthalten, obwohl am Ende nicht ein einziger echter
Treffer dabei heraus kommt.

Dafür könnte ich mir die Index-Tabelle sparen, die
ja sehr schnell eine Mio Datensätze und mehr haben
würde, ob das so gut wäre?

Wie möchtest Du ohne die Indextabelle die Suchvorgänge
schnell bekommen?

ich denke der Fulltext-Index in mysql dürfte das
schneller und sparsamer machen, oder?

FULLTEXT _ist_ eine Indextabelle (über bestimmte Arten
von Worten des Textes, die nur bestimmte Zeichen ent-
halten und eine bestimmte Mindestlänge aufweisen - ich
habe genau diese beiden Stellen im mySQL-Quelltext
ändern und das RDBMS neu übersetzen müssen, um den
Begriff "Wort" auf meine eigene Aufgabenstellung an-
zupassen).

Tabelle ist, das ist relativ egal - aber ob Du
einfach eine Datei aufmachst oder eine Datenbank-
schnittstelle per SQL ansteuern mußt, das ist für
jemand, der in SQL nicht fit ist, sehr wohl ein
Unterschied.
Ich meinte halt, das mit ein MySQL Daten schneller
durchsuchen kann als PHP, da dafür optimiert!

Nein. Nicht mySQL ist schnell, sondern eine Daten-
struktur in Kombination mit einem Algorithmus. Die
Realisierung kann in jeder Sprache erfolgen; für mySQL
spricht lediglich, daß _bestimmte_ Realisierungen
bereits fertig vorhanden sind. Wenn Deine Aufgaben-
stellung sich mit mySQL elegant lösen läßt, mußt Du
üblicherweise weniger eigenen Code schreiben als mit
PHP - auch weil SQL abstrakter ist als PHP und damit
üblicherweise kompakter.

Sehr interessant - und so einfach, da wäre ich nie
drauf gekommen, nur wie soll ich das erstellen?

Mit einem Programm. ;-)

Wenn ich tatsächlich 1.000 Seiten mit je 10.000
Worten gleichzeitig

Nacheinander.

indizieren will, mal abgesehen vom php-timeout,
soll ich in einer schleife 10 Mio Inserts starten?

Kommt jedes Wort denn nur genau einmal pro Dokument
vor? Andernfalls sind es viel weniger INSERTs.

Wie soll das gehn? Womit?

Wie gesagt: Mit einem Programm, das in einer Schleife
über jedes Deiner Dokumente läuft, dieses in Worte
zerhackt, deren relative Häufigkeit bestimmt und die
gesamte Qualitätsbestimmung des Wortes (Relevant) für
dieses Dokument bestimmt und dann viele einzelne
INSERTs durchführt.
In bestimmten SQL-APIs kann man INSERTs übrigens
blockweise durchführen - es ist performanter, ein
paar tausend Zeilen auf einmal einzufügen, weil dann
nicht so viele API-Zugriffe erfolgen (die kosten
reichlich Overhead).

Außerdem ´habe ich das problem, dqas ich
wahrscheinlich 80% der Wörter gar nicht brauche,
da danach eh nicht gesucht wird.

Dann mach Dir eine Stopwortliste. mySQL-FULLTEXT hat
so etwas.

Nur leider kann man das nur sehr schwer
automatisiert machen, höchtens ein paar die ganz
oft vorkommen in einen arra schreiben und immer
prüfen ob if(in_array("Wort")) oder sowas.

Gar nicht erst in den Index schreiben.
(Die Liste in mySQL ist etwa 500 Worte lang.)

Wäre aber wohl eher ein Tropfen auf den heißen
Stein oder?

Wenn diese Worte sehr oft vorkommen (und sehr wenig
aussagen, z. B. "ist" oder "hat"), kann das durchaus
ziemlich viel sparen. Und solange Du keine Phrasen
finden willst, in denen so ein Wort enthalten ist ...

Viele Grüße
      Michael