Seite 1 von 1

Volltextsuche

Verfasst: 27.07.2008, 17:57
von Burns
Hallo an alle,

ich arbeite gerade an einer Volltextsuche mit PHP und MySql und soweit funktioniert auch alles prima. NUR wenn z.B nach 10.00 oder 100.000 suche, wird das ignoriert bzw. nichts gefunden. Es müsste aber was gefunden werden. Ich nehme an, der entfernt den . und erhält somit 10 und 000. dannach sucht der aber nicht weil die Zeichenzahl kleiner als 4 ist.

Hat jemand ne Idee wie ich das umgehen kann ?



SELECT * FROM `tabelle` WHERE match(title,description) against('100.000' IN BOOLEAN MODE)

Gruß

Verfasst:
von
SEO Consulting bei ABAKUS Internet Marketing
Erfahrung seit 2002
  • persönliche Betreuung
  • individuelle Beratung
  • kompetente Umsetzung

Jetzt anfragen: 0511 / 300325-0.


Re: Volltextsuche

Verfasst: 03.08.2008, 09:17
von Outman
Burns hat geschrieben:Hallo an alle,

ich arbeite gerade an einer Volltextsuche mit PHP und MySql und soweit funktioniert auch alles prima. NUR wenn z.B nach 10.00 oder 100.000 suche, wird das ignoriert bzw. nichts gefunden. Es müsste aber was gefunden werden. Ich nehme an, der entfernt den . und erhält somit 10 und 000. dannach sucht der aber nicht weil die Zeichenzahl kleiner als 4 ist.

Hat jemand ne Idee wie ich das umgehen kann ?



SELECT * FROM `tabelle` WHERE match(title,description) against('100.000' IN BOOLEAN MODE)

Gruß
Versuche es mal mit

Code: Alles auswählen

$sql="SELECT *  FROM `tabelle` WHERE MATCH ( title,description) AGAINST ( '".$suchwort."' ) OR title LIKE '%".$suchwort."%' OR description LIKE '%".$suchwort."%'  LIMIT  30";
solltest aber auf jeden fall eine index für title und description anlegen, sonst hast Du eine Mysql killer.

Grüße Nico

Re: Volltextsuche

Verfasst: 03.08.2008, 11:26
von nerd
Outman hat geschrieben: Versuche es mal mit

Code: Alles auswählen

$sql="SELECT *  FROM `tabelle` WHERE MATCH ( title,description) AGAINST ( '".$suchwort."' ) OR title LIKE '%".$suchwort."%' OR description LIKE '%".$suchwort."%'  LIMIT  30";
solltest aber auf jeden fall eine index für title und description anlegen, sonst hast Du eine Mysql killer.
sorry, aber LIKE '%keyword%' is moppelkotze. selbst bei ein paar tausend datensaetzen kann die db da schnell mal 10 sekunden und laenger beschaeftigt sein. index hilft dir bei LIKE %keyword% nix weil ja trotzdem alle records komplett gescannt werden muessen ob keyword IRGENDWO darin vorkommt - ungefaehr als musst du das telefonbuch nach allen leuten mit vornamen "klaus" durchsuchen - der index ist aber nur auf nachnamen gesetzt.

du solltest einen suchindex erstellen (id, keyword - index auf keyword) und dann eine 2. tabelle in der du vermerkst in welchem eintrag x das wort y vorkommt. der wortindex bleibt dabei ziehmlich klein; in der umgangssprache werden nur ca. 3-5000 woerter verwendet. ausserdem sollest du dabei stopwoerter wie "der, die, das, dessen, wenn, um, aus, ..." rausfiltern die keine eigentliche bedeutung haben aber in fast jedem satz vorkommen.
wenn du dann nach einem wort suchst laesst du dir zuerst eine liste mit ergebnissen aus einem join der 2 tables ausgeben, und machst dann einen zweiten durchgang mit "like" an dem der ersten abfrage falls du ein exact match brauchst.

Re: Volltextsuche

Verfasst: 03.08.2008, 21:10
von Outman
nerd hat geschrieben:
Outman hat geschrieben: Versuche es mal mit

Code: Alles auswählen

$sql="SELECT *  FROM `tabelle` WHERE MATCH ( title,description) AGAINST ( '".$suchwort."' ) OR title LIKE '%".$suchwort."%' OR description LIKE '%".$suchwort."%'  LIMIT  30";
solltest aber auf jeden fall eine index für title und description anlegen, sonst hast Du eine Mysql killer.
sorry, aber LIKE '%keyword%' is moppelkotze. selbst bei ein paar tausend datensaetzen kann die db da schnell mal 10 sekunden und laenger beschaeftigt sein. index hilft dir bei LIKE %keyword% nix weil ja trotzdem alle records komplett gescannt werden muessen ob keyword IRGENDWO darin vorkommt - ungefaehr als musst du das telefonbuch nach allen leuten mit vornamen "klaus" durchsuchen - der index ist aber nur auf nachnamen gesetzt.

du solltest einen suchindex erstellen (id, keyword - index auf keyword) und dann eine 2. tabelle in der du vermerkst in welchem eintrag x das wort y vorkommt. der wortindex bleibt dabei ziehmlich klein; in der umgangssprache werden nur ca. 3-5000 woerter verwendet. ausserdem sollest du dabei stopwoerter wie "der, die, das, dessen, wenn, um, aus, ..." rausfiltern die keine eigentliche bedeutung haben aber in fast jedem satz vorkommen.
wenn du dann nach einem wort suchst laesst du dir zuerst eine liste mit ergebnissen aus einem join der 2 tables ausgeben, und machst dann einen zweiten durchgang mit "like" an dem der ersten abfrage falls du ein exact match brauchst.
Naja ich habe eine Index über zwei Spalten und komme mit der Abfrage ohne Probleme mit knapp 20000 Datensätze auf 0.0378s Abfragezeit hin. Es ist halt die Frage wie viele Datensätze gesucht werden sollen und wie viele Datensätze sich in der Tabelle befinden und ob sich der aufwand dafür lohnt das Script so zu erweitern.

Verfasst: 03.08.2008, 21:58
von Burns
hallo und danke für die guten Vorschläge,

Die schnellere Volltextsuche kann leider nicht mit LIKE %% kombiniert werden. Also kann schon aber die Geschwindigkeit wäre gleich dem einer reinen LIKE %%-Suche

Die Datenbank hat jetzt 51.000 Einträge mit 30 MB und wird nun etwas langsamer. Da die Größe auf das Dreifache ausgedehnt werden soll, wollt ich auf Volltextsuche umstellen. Das ist aber derzeit nicht möglich weil eben nur ab einer Zeichenlänge von 3 Zeichen gesucht wird.

Bis jetzts habe ich keine Lösung gefunden und denke mal dass ich die Volltextsuche für meine Zwecke nich verwenden kann.