MySQL FULLTEXT met varianten op woorden

Pagina: 1
Acties:

Vraag


Acties:
  • 0 Henk 'm!

  • RickyHeijnen
  • Registratie: Maart 2005
  • Laatst online: 30-04 09:02
De vraag heeft betrekking op een webshop met +150.000 producten. De zoekfunctie in de shop maakte tot voor kort gebruik van een paar simpele gecombineerde LIKE queries. Maar vaak leverde dit geen resultaat op en ben na wat googlen op de FULLTEXT methode gekomen, dit was tot voor kort nog nieuw voor mij, maar heb dit inmiddels aardig onder de knie en werkt in principe een stuk beter dan de LIKE queries voorheen deden.

Waar ik nu nog tegenaan loop is dat ik in de zoekhistorie zie dat er niet altijd een goed resultaat uit de zoekquery van de gebruiker komt omdat hij varianten gebruikt van diverse termen. Is er een manier om hier in de MATCH ... AGAINST rekening mee te houden?

Voorbeeld:
Product heet: "Buitenspiegel rechts Volkswagen Golf IV"
Bezoeker zoekt: "Rechter buitenspiegel vw golf 4".

Is er zoiets mogelijk als "MATCH(name) AGAINST('(rechts || rechter) +buitenspiegel (Volkswagen || VW) (Golf 4 || Golf IV)')"

Of is het beter om een soort synoniemen tabel te maken waarbij ik eerst de zoekquery van de gebruiker met wat replaces omzet naar "rechts buitenspiegel volkswagen golf 4" ?

Als ik google op ecommerce search best practices mysql kom ik niet echt hele nuttige informatie tegen. Wat zijn jullie tips? Hoe zouden jullie zoiets aanpakken? Ik ben niet perse op zoek naar dé oplossing, maar eerder wat handvaten om wat verder te komen :)

Dank vast.

Alle reacties


Acties:
  • +1 Henk 'm!

  • emnich
  • Registratie: November 2012
  • Niet online

emnich

kom je hier vaker?

Misschien niet het antwoord wat je zoekt maar ik gebruik hiervoor Sphinx waar je dit met wordforms (en evt stemming) kan doen. Je zal wel handmatig je wordforms moeten gaan verzamelen.

Veel andere fulltext searchengines kunnen dit ook wel maar MySQL volgens mij (nog) niet.

Acties:
  • +4 Henk 'm!

  • BCC
  • Registratie: Juli 2000
  • Laatst online: 20:25

BCC

Je wil hier inderdaad een text search engine naast zetten als solr of elasticsearch. Mysql is hier niet geschikt voor.

Na betaling van een licentievergoeding van €1.000 verkrijgen bedrijven het recht om deze post te gebruiken voor het trainen van artificiële intelligentiesystemen.


Acties:
  • +1 Henk 'm!

  • DJMaze
  • Registratie: Juni 2002
  • Niet online
"vw", "4" en "IV" wordt standaard helemaal niet op gezocht, dat komt door de ft_min_word_len

Eigenlijk moet je dus een systeem hebben om de woorden om te zetten.
vw => volkswagen
4 => vier
IV => vier

Dan kan je ook nog kiezen voor een "zoekwoorden" tabel.
Waarbij elk woord een INT krijgt en een VARCHAR BINARY LOWERCASE STRIP UNICODE MODIFIERS
Vervolgens een "artikel_zoekwoorden" tabel met het artikel.id en zoekwoorden.id.
Klaar!

Maak je niet druk, dat doet de compressor maar


  • ACM
  • Registratie: Januari 2000
  • Niet online

ACM

Software Architect

Werkt hier

Er zijn veel mogelijkheden hiervoor bij de betere zoekmachines (o.a. elastic search en solr, wellicht ook bij sphinx en de sphinx-integratie in mysql).

Rechts, rechter en recht zijn vaak met stemming te combineren toch recht. Helaas betekent dat wel dat je meerdere verschillende betekenissen nog meer samenvoegt (een niet-krom iets, juridisch gebeuren en de andere kant dan links). Dat is overigens ook zonder stemming al vrij gebruikelijk met onze taal.

Voor VW vs Volkswagen en 4 vs IV vs vier kan je meerdere dingen doen:
Tijdens het indexeren synoniemen normaliseren tot een vorm. Dus bijvoorbeeld altijd 'volkswagen' en 'golf iv' opslaan, ipv soms vw en soms Golf IV. Tijdens het zoeken moet je dan diezelfde normalisatie van synoniemen doen.

Of je kan het alleen tijdens het zoeken doen. Dat als gebruikers vw of volkswagen intypen, dat dat omgezet wordt tot het equivalent van (vw OR volkswagen).

Je kan ook tijdens het indexeren alle synoniemen laten meenemen (dus zowel vw als volkswagen opslaan) en niets met de zoekopdracht doen.

Ze hebben allemaal voor- en nadelen. Zo varieert kan onder andere de manier waarop de resulaten worden gewogen veranderen afhankelijk of de zoekopdracht of juist de index wordt aangepast. Of door aggresief synoniemen in te zetten worden allerlei termen samengevoegd, die misschien in hun context juist anders moeten worden behandeld.

Als je dit wilt kunnen, lijkt me MySQL fulltext echter te beperkt... Wellicht is de Sphinx-integratie interessant voor je.
DJMaze schreef op vrijdag 09 september 2016 @ 16:32:
Dan kan je ook nog kiezen voor een "zoekwoorden" tabel.
Waarbij elk woord een INT krijgt en een VARCHAR BINARY LOWERCASE STRIP UNICODE MODIFIERS
Vervolgens een "artikel_zoekwoorden" tabel met het artikel.id en zoekwoorden.id.
Klaar!
Dat klinkt heel goed... maar je mist dan heel wat dingen die zoekmachines er ook bij (kunnen) doen. Onder andere de weging op hoe gebruikelijk of ongebruikelijk een woord is (of combinatie van twee woorden) of kunnen zoeken met de juiste volgorde van de termen (dus wel 'golf 5' kunnen matchen, maar niet '5 deurs golf 3'). En een ander nadeel is dat die oplossing slecht schaalt; meerdere zoektermen combineren levert een ingewikkelde SQL-query op en dat wordt erger naarmate er meer zoektermen bijkomen.

[ Voor 21% gewijzigd door ACM op 10-09-2016 13:34 ]


  • DirkZzZ
  • Registratie: September 2007
  • Laatst online: 04-09 10:02
Veel suggesties hier waarbij het beheer en de finetuning ervan straks ook bij jullie intern zullen gaan liggen, en daar is natuurlijk niets mis mee het is een afweging die je maakt.

Maar het kan ook interessant zijn om eens te kijken naar Algolia ( https://www.algolia.com/ )
Je krijgt ook een overzicht van zoekopdrachten die 0 resultaten opleverde, om even jouw eigen voorbeeld te nemen dan kan een conclusie zijn dat 4 en IV synoniem zijn aan elkaar en dat is in te stellen binnen algolia.

En zo hebben ze nog wel meer handige features, het is 14 dagen gratis te proberen en ik denk dat het veel problemen oplost voor jullie.
Pagina: 1