Suchmaschine eleganter Algorithmus
Suchmaschine eleganter Algorithmus
am 25.04.2005 19:35:37 von steve_bb
Ich möchte eine neue Version der Produktsuchmaschine für einen Web-Shop
programmieren.
Ich habe mich ein wenig im Netz umgeschaut und ich habe mir einen neuen
Programmablauf überlegt, den ich gerne einmal vorstellen würde bevor ich
wild drauf losprogrammiere und es dann doch an einem übersehenden Detail
scheitert.
Es wäre klasse, wenn ihr euch mal den Ablauf anschauen könntet und mir sagen
würden ob das so
sinnvoll ist und auch perfomant, oder was man noch verbessern könnte.
Schonmal Danke im Voraus!
Anforderungen an die neue Produktsuchmaschine:
1. Durchsucht mehrere Spalten der Produktdatenbank (z.B. Titel,
Beschreibung).
2. Sortiert nach Relevanz. (z.B. doppeltes Vorkommen relevanter als
einfaches, hier würde ich einfach der MySQL-internen Relevanzsortierung bei
Volltextsuchen vertrauen und keine eigene Sortierung mehr vornehmen.)
3. Produktsuche einschränkbar auf einzelne Produktgruppen inkl.
Produktuntergruppen.
neuer Lösungsansatz:
1.
Volltextindex über die zu durchsuchenden Spalten.
2.
anstatt sämtliche Produkte einzeln durchzugehen um rauszufinden ob sie
sich unterhalb der Produktgruppe befinden die zur Durchsuchung ausgewählt
worden ist, erstelle ich einmalig vorab ein Array mit sämtliche Untergruppen
der ausgewählten Gruppe. z.B. $untergruppen=(1,5,99,234,87,44);
3. Dann baue ich meine Such-Query mit Hilfe des Arrays mit den Untergruppen
auf:
Beispiel:
SELECT * FROM produkte
WHERE MATCH (titel, beschreibung) AGAINST ('Suchwort') AND
Parent-ID in (1,5,99,234,87,44)
Klappt das so wie ich mir das denke? Welche Nachteile kann eine solche
volltextindex-suche mit sich bringen?
2 Dinge sprechen für mich noch momentan gegen eine Volltextsuche:
1. Mindestlänge von >3 finde ich sehr unpraktisch. Man könnte damit garnicht
nach Suchbegriffen wie "Uhr" "CD" oder "H&M" suchen. das müßte ich
unbedingt auf >1 oder auf deutsch 2 Buchstaben Mindestlänge umstellen. Aber
wie? Ich habe von dem Trick gehört ein * dranzuhängen bzw. mehrere * um auf
die 4 Zeichen zu kommen. Allerdings würde dann die Suchanfrage "Uhr*" nicht
"Uhr" finden sondern nur "Uhrwerk" etc.
2. Die Nummern im Katalog sind mit Bindestrichen in Blöcke getrennt zb.
2-2164-4-8-1. Ich habe aber gelesen, dass Bindestriche automatisch als
Negationen aufgefasst werden. Kann man das ausstellen oder muss ich in der
Datenbank die einzelnen Bindestriche durch ein anderes Zeichen ersetzen und
dann bei der Sucheanfrage alle Bindestriche erstmal durch dieses Zeichen
ebenfalls ersetzen? Fände ich umständlich.
So, das war's. Für alle Ideen und Anregungn bin ich euch sehr dankbar. Ich
muss unbedingt die letzten beiden Hürden irgendwie überwinden.
Stefan
Re: Suchmaschine eleganter Algorithmus
am 26.04.2005 09:40:33 von Bjoern P
Hallo,
ich habe auch versucht mit Fulltext Search eine Suchmaschine zu bauen, weil
ich es sehr komfortabel fand.
Jedoch haben sich bei einige Probleme ergeben.
- keine korrekte Ausgabe der Ergebnisse mit Hilfe von * (Suche nach *MZ*
bringt keine Ergebnisse, müsste aber)
- die * vor dem Suchstring werden ignoriert
Dein Problem mit mindest Wortlänge kannst du in der my.ini ändern indem du
folgendes ergänzt:
ft_min_word_len =1.
einmal zum weiteren schauen
http://dev.mysql.com/doc/mysql/en/fulltext-search.html
Ich habe alles im Endeffekt mit einer LIKE abfrage gemacht und es
funktioniert so wie ich es mir vorgestellt habe.
mfg
Björn
"Stefan B. König" schrieb im Newsbeitrag
news:d4j9n0$6v5$1@newsreader3.netcologne.de...
> Ich möchte eine neue Version der Produktsuchmaschine für einen Web-Shop
> programmieren.
> Ich habe mich ein wenig im Netz umgeschaut und ich habe mir einen neuen
> Programmablauf überlegt, den ich gerne einmal vorstellen würde bevor ich
> wild drauf losprogrammiere und es dann doch an einem übersehenden Detail
> scheitert.
>
> Es wäre klasse, wenn ihr euch mal den Ablauf anschauen könntet und mir
> sagen
> würden ob das so
> sinnvoll ist und auch perfomant, oder was man noch verbessern könnte.
>
> Schonmal Danke im Voraus!
>
> Anforderungen an die neue Produktsuchmaschine:
>
> 1. Durchsucht mehrere Spalten der Produktdatenbank (z.B. Titel,
> Beschreibung).
>
> 2. Sortiert nach Relevanz. (z.B. doppeltes Vorkommen relevanter als
> einfaches, hier würde ich einfach der MySQL-internen Relevanzsortierung
> bei
> Volltextsuchen vertrauen und keine eigene Sortierung mehr vornehmen.)
>
> 3. Produktsuche einschränkbar auf einzelne Produktgruppen inkl.
> Produktuntergruppen.
>
>
> neuer Lösungsansatz:
>
> 1.
> Volltextindex über die zu durchsuchenden Spalten.
> 2.
> anstatt sämtliche Produkte einzeln durchzugehen um rauszufinden ob sie
> sich unterhalb der Produktgruppe befinden die zur Durchsuchung ausgewählt
> worden ist, erstelle ich einmalig vorab ein Array mit sämtliche
> Untergruppen
> der ausgewählten Gruppe. z.B. $untergruppen=(1,5,99,234,87,44);
>
> 3. Dann baue ich meine Such-Query mit Hilfe des Arrays mit den
> Untergruppen
> auf:
>
> Beispiel:
>
> SELECT * FROM produkte
> WHERE MATCH (titel, beschreibung) AGAINST ('Suchwort') AND
> Parent-ID in (1,5,99,234,87,44)
>
>
> Klappt das so wie ich mir das denke? Welche Nachteile kann eine solche
> volltextindex-suche mit sich bringen?
>
> 2 Dinge sprechen für mich noch momentan gegen eine Volltextsuche:
>
> 1. Mindestlänge von >3 finde ich sehr unpraktisch. Man könnte damit
> garnicht
> nach Suchbegriffen wie "Uhr" "CD" oder "H&M" suchen. das müßte ich
> unbedingt auf >1 oder auf deutsch 2 Buchstaben Mindestlänge umstellen.
> Aber
> wie? Ich habe von dem Trick gehört ein * dranzuhängen bzw. mehrere * um
> auf
> die 4 Zeichen zu kommen. Allerdings würde dann die Suchanfrage "Uhr*"
> nicht
> "Uhr" finden sondern nur "Uhrwerk" etc.
>
> 2. Die Nummern im Katalog sind mit Bindestrichen in Blöcke getrennt zb.
> 2-2164-4-8-1. Ich habe aber gelesen, dass Bindestriche automatisch als
> Negationen aufgefasst werden. Kann man das ausstellen oder muss ich in der
> Datenbank die einzelnen Bindestriche durch ein anderes Zeichen ersetzen
> und
> dann bei der Sucheanfrage alle Bindestriche erstmal durch dieses Zeichen
> ebenfalls ersetzen? Fände ich umständlich.
>
>
> So, das war's. Für alle Ideen und Anregungn bin ich euch sehr dankbar. Ich
> muss unbedingt die letzten beiden Hürden irgendwie überwinden.
>
> Stefan
>
>
Re: Suchmaschine eleganter Algorithmus
am 26.04.2005 16:45:56 von steve_bb
Hallo Björn,
wie gesagt, momentan habe ich eine funktionierende Suchmaschine, die jedoch
ohne Volltextsuche programmiert ist und die wird einfach zu lahm bei mehr
als 100 Suchergebnissen, weil ich für jeden Eintrag die Relevanz mit PHP
erst bestimmen. Match Against würde das ja automatisch machen.
> Dein Problem mit mindest Wortlänge kannst du in der my.ini ändern indem du
> folgendes ergänzt:
> ft_min_word_len =1.
leider habe ich keinen Zugriff auf die my.ini. Kann ich es vielleicht zur
laufzeit setzen? Oder gibt es einen Work around?
Stefan
Re: Suchmaschine eleganter Algorithmus
am 27.04.2005 10:03:30 von Bjoern P
Hallo Stefan,
> leider habe ich keinen Zugriff auf die my.ini. Kann ich es vielleicht zur
> laufzeit setzen? Oder gibt es einen Work around?
warum kommst du nicht an deine my.ini ran?
Dein Hoster müsste es ja für dich realisieren können, sollte sie nicht
existieren, kann man sie auch selber anlegen, zumindest hat das unser Hoster
das gesagt.
Ich denke aber das es nicht zur Laufzeit geht, diesen Hinweis habe ich bei
den Kommentaren zur Volltextsuche gefunden.
http://dev.mysql.com/doc/mysql/en/fulltext-search.html
--
Gruesse
Bjoern
für mail an mich bitte "_SPAMMENOT_" entfernen