Andreas Korthaus: Suche online(funktionsfähig) / Perfromance-Verbesserungen?

Beitrag lesen

Hallo Michael!

* +wort bedeutet, dass das Wort in jeder
  zurückgegebenen Zeile enthalten sein muss.
* -wort bedeutet, dass das Wort in jeder
zurückgegebenen Zeile nicht enthalten sein darf.

Beides ist durch entsprechend generierte WHERE-
Klauseln schon jetzt möglich.

Aber da geht e mit einer Abfrage des index, das geht heute nicht!

* < und > können benutzt werden, um die
  Wortgewichtung in der Anfrage herab- und
  heraufzusetzen.

Ja, aber ich will diese Ranking-Funktion ohnehin
nicht benutzen. Was ich an Deiner Stelle einbauen
würde, wäre eine eigene Ranking-Funktion. Ein Term
dieser Funktion wäre die Anzahl der Postings des
Autors in dieser Kategorie ... das hebt die Spezia-
listen heraus, das _muss_ eine gute Näherung sein.

* * ist ein Trunkierungsoperator.

Was heißt das genau?

Wenn ich mich nicht irre sowas wie wildcard, um Substrings zu finden, oder?
MySQL 4 hat noch eine nete Funktion, und zwar:

"Funktionen wie SQL_CALC_FOUND_ROWS und FOUND_ROWS() ermöglichen herauszufinden, wie viele Zeilen eine Anfrage ohne eine LIMIT-Klausel zurückgegeben hätte."

Das ist wohl sehr Sinnvoll!
und in einer der nächten Versionen wird tatsächlich eine Phrasensuche implementiert.

  1. Verwendung regulärer Perl-Ausdrücke in Termen.
       (Das wird schwierig, aber vielleicht mit mySQL 4
       möglich?)

Das ist ja bereits möglich, ähnlich wie LIKE, aber ich denke das ist ziemlich langsam.

  1. case-sensitive Suche (finde ich wichtig).

wofür? bei welchem Wort würde es einen Unterschied machen ob Du es groß geschreiben oder klein geschreiben fimdest?

  1. Die Möglichkeit, Terme mit Suchbereichen einzugeben
       (author:cheatah body:mailto).

Das ist machbar, erfordert aber eine viel genauerer
   Analyse der eingegebenen Suchbegriffe - also: Arbeit.

Ja, das mache ich ja teilweise jetzt schon, nur auf mehrere Variablen verteilt, den Suchstring prüfe ich auf + und -
Wär lkein Problem, was   ich vergessen habe ist mailto zu parsen ;-) Wäre ja nicht verkehrt das genaus zu machen wie die Vielposterstatistik, die ja auch auf den Email-Adressen beruht. Nochmal wegen Vielpposter-Satstistik, bzw. deren Verwendung fpr eun REanking, würdest Du jedesmal die Relevanz während der Suche aus der Posting-Tabelle abfragen, oder eher eine eigene Poster-Statistilk Tabelle zu verwenden, die dann per Cron oder bei Inserts aktualisiert wird!

Die genaue Notation habe ich nicht im Kopf - kannst
Du die (6) nicht einfach weglassen?

Ich glaube nicht. Aber das ist ein Verständnis-Problem meinerseits: Wie kann ich ein Feld auf Bits beschrängen, ud wie füge ich eine Zahl als Bit ein? Und was habe ich davon? Ich dachte interger wäre schon gut!

Ich meinte nur: smallint belegt doch wohl sowieso eine
bestimmte Anzahl bits - warum dann auf 6 Dezimalen
einschränken?

Ach so.

Eine Phrase läßt sich durchaus mit mySQL 3.23 lösen:

Zerschlage sie in all ihre 'Worte' (gemäß der Termi-
nologie von FULLTEXT), mache ein AND darüber, bete ein
bißchen, daß es _jetzt_ nur noch wenige Treffer sind,
und mache anschließend ein LIKE %phrase% über das
gesamte Posting!
Wenn Du die Treffermengen klein genug kriegst, wird
das funktionieren. Mit großen hast Du keine Chance.
(Deshalb ist mir das AND so unheimlich wichtig!)

Wenn ich nachträglch so eie Filrung vornehme, dann kann ich ja das Limit erhöhen, das weiß ich ja vorher, z.B. von 200 auf 1000. Sonst habe ich 200 Datensätze von denen aber nur 10 die Phrase enthalten, aber noch 50 oder mehr aufgrund des niedrigen Limits schon vorher unter den Tisch gefallen sind.

Stimmt, das hatte ich auch schon gedacht, das
Ergebinis in einen Array schreiben und den munter
sortieren!

Die Ranking-Funktion kann auch schon statisch beim
Import berechnet und in der Tabelle abgespeichert wer-
den. Stell Dir vor, diese Funktion wäre identisch
zur Anzahl der Postings des Autors in dieser Kategorie
zum Zeitpunkt der Aufnahme dieses Postings. Dann wäre
das einfach eine zusätzliche Spalte in Deiner Tabelle,
nach der Du die Treffer mit ORDER BY auslesen kannst.

Aber die Rankong-Funktion ist doch abhängig von der Suche, woher willst Du beim Import wissen was später mal gesucht wird? Sollte man das nicht vielleicht eher mit tenporären HEAP-Tabellen machen, in die man das Ergebnis schreibt und da die Relevanz berechnet?

Fein - das hilft allen Testern, zu sehen, was passiert.

Aber EXPLAIN gibt glaube ich viel zu wenig aus, stimmt das so? Sind halt 6 aAngaben oder so, mehr nicht. Was ich aber daraus groß ableiten soll, auißer das der Fulltext wohl jedesmal verwendet wird, weiß ich nicht.

Viele Grüße
Andreas