[MySQL/PHP] Zoekfunctie met Boolean mode *

Pagina: 1
Acties:

Onderwerpen


Acties:
  • 0 Henk 'm!

  • Wolf3D
  • Registratie: Augustus 2001
  • Laatst online: 22-08 12:03
Aangezien ik nou al een hele tijd bezig ben om de 'perfecte' SQL-zoekopdracht te formuleren .. en ik maar niet bereik wat ik wil, roep ik jullie hulp ff in.

Het is de bedoeling om te kunnen zoeken op een soort marktplaats-achtige website. Er kan worden gezocht op de titel en de beschrijving van de advertentie. Daarbij vind ik het sorteren op relevantie wel fijn, dus heb ik een FULLTEXT gedaan op de velden beschrijving en titel, en gebruik ik MATCH .. AGAINST enzo. Aangezien ik wil dat ook bij 50% of meer de resultaten teruggegeven moeten worden, en ik wil gebruik maken van operators, gebruik ik IN BOOLEAN MODE.
Daarnaast zou ik het ook fijn vinden als hij 'fietsband' vindt als ik zoek op 'fiets'. Maar ook de zoekopdracht 'e' moet, hoe nutteloos dan ook, records teruggeven waar een 'e' in voorkomt.

In BOOLEAN MODE kan je echter alleen de ster (*) ACHTER het te zoeken woord zetten, en niet ervoor. Zoeken op 'fiets' levert dus wel 'fietsband' op, maar niet 'bakfiets'.

Nou mijn vraag: Hoe los ik dit op?

Daarnaast worden bepaalde woorden en woordcombinaties soms niet gevonden.

SQL-zoekopdracht:
code:
1
2
3
4
5
6
SELECT id, titel, beschrijving,
  MATCH (titel, beschrijving) AGAINST ('$zoekterm') AS score
FROM tabel
WHERE MATCH (titel, beschrijving) AGAINST ('$zoekterm*' IN BOOLEAN MODE)
ORDER BY score DESC
LIMIT $vanaf, 30


Ik heb bijvoorbeeld een record met de volgende (onzin-)beschrijving:
"Ik zoek een goed werkende telefoon om mee te bellen in USA"

Zoekterm: (0 = record niet gevonden, 1 = record wel gevonden)

een -> 0
tel -> 1
om mee -> 0
telefoon -> 1
telefoon mee -> 1
USA -> 0
USA bellen -> 1

Na enige analyse kom ik er achter dat een woordje met minder dan 4 letters niet geliefd is mits dit een losstaand woord is. Zoeken op 'tel' levert dan weer geen problemen op, gezien het een deel van het woord telefoon is. Dit heeft dan weer te maken met de ster (*) die ik gebruik. Maar.... hoe los ik dit probleem op zodat ook losstaande korte worden gevonden worden?

Excuses voor het lange bericht, maar hopelijk heb ik de problemen zo duidelijk omschreven...

[ Voor 5% gewijzigd door Wolf3D op 28-10-2005 15:20 ]


Acties:
  • 0 Henk 'm!

  • Arjan A
  • Registratie: November 2000
  • Laatst online: 12:24

Arjan A

Cenosillicafoob

De minimale lengte van woorden kan je opgeven in my.cnf (ft_min_word_len), deze staat default op 3.
Als je dat naar beneden aanpast, moet je (dacht ik) MySQL herstarten, maar ook moet de tabel opnieuw geindexeerd worden (vanwege meer woorden die nu mee mogen doen). MySQL geeft volgens mij op hun website ergens wel aan dat je performance achteruit gaat. Moet je zelf maar afwegen.

Canon EOS | DJI M2P
Fotoblog · Mijn werk aan jouw muur


Acties:
  • 0 Henk 'm!

  • Wolf3D
  • Registratie: Augustus 2001
  • Laatst online: 22-08 12:03
Bedankt voor je antwoord!
Helaas wordt de website gewoon gehost bij een hostingprovider die niet voor mij MySQL wil herstarten, verwacht ik. Ook achteruitgang van performance klinkt niet fijn, hoewel ik daar zowiezo niet onderuit zal komen als ik beter wil kunnen zoeken...
Zijn er geen andere mogelijkheden? Zelf zat ik te denken om indien MATCH .. AGAINST niks kan vinden, er een LIKE op los te laten, maar dat zal helemaal ten koste gaan van de performance, ben ik bang....

Acties:
  • 0 Henk 'm!

  • LauPro
  • Registratie: Augustus 2001
  • Laatst online: 19-09 16:51

LauPro

Prof Mierenneuke®

Wat heeft het voor een nut om op drieletterwoorden te zoeken? Ik denk dat vrijwel alle drieletterwoorden zoveel vergelijkbare betekenissen hebben dat het niet nuttig is. Je zou kunnen overwegen om een gebruiker zijn invoer van te voren te rubriceren. Bijvoorbeeld rubriek mobiele telefoons. Dat maakt het zoeken/filteren veel makkelijker.

Inkoopacties - HENK terug! - Megabit
It is a war here, so be a general!


Acties:
  • 0 Henk 'm!

Verwijderd

Jah laat de gebruiker jouw technische problemen oplossen.

Volgens mij kan je met like % ook voor en achter zoeken en dan laat je een extra query lopen waarmee je het percentage berekent

Acties:
  • 0 Henk 'm!

  • Wolf3D
  • Registratie: Augustus 2001
  • Laatst online: 22-08 12:03
LauPro schreef op vrijdag 28 oktober 2005 @ 15:37:
Wat heeft het voor een nut om op drieletterwoorden te zoeken? Ik denk dat vrijwel alle drieletterwoorden zoveel vergelijkbare betekenissen hebben dat het niet nuttig is. Je zou kunnen overwegen om een gebruiker zijn invoer van te voren te rubriceren. Bijvoorbeeld rubriek mobiele telefoons. Dat maakt het zoeken/filteren veel makkelijker.
Het zoeken op drieletterige woorden heeft volgens mij zeker nut. Woorden als HET en EEN zijn natuurlijk nutteloos, maar BUS of TAS of BMW moeten wel resultaten opleveren als records deze woorden bevatten.
Verwijderd schreef op vrijdag 28 oktober 2005 @ 15:40:
Jah laat de gebruiker jouw technische problemen oplossen.

Volgens mij kan je met like % ook voor en achter zoeken en dan laat je een extra query lopen waarmee je het percentage berekent
MATCH biedt meerdere voordelen boven LIKE, waardoor ik voor deze methode gekozen heb. Misschien een combinatie van MATCH & LIKE, zoals ik hierboven ook schreef?
Ik zou alleen even niet weten hoe ik dat kan combineren...

Acties:
  • 0 Henk 'm!

  • GX
  • Registratie: Augustus 2000
  • Laatst online: 14-05 09:40

GX

Nee.

Wolf3D schreef op vrijdag 28 oktober 2005 @ 15:35:
Zijn er geen andere mogelijkheden? Zelf zat ik te denken om indien MATCH .. AGAINST niks kan vinden, er een LIKE op los te laten, maar dat zal helemaal ten koste gaan van de performance, ben ik bang....
Ga daar maar van uit; nu weet ik weinig van de snelheid van de MATCH .. AGAINST methode; maar het zal hoogstwaarschijnlijk stukken sneller zijn dan LIKE omdat het gebruik maakt van een FULLTEXT index.

Je zou wel een eigen "index" kunnen maken van woorden en daar doorheen lopen met like '%<term>%', maar ook daar betwijfel ik of de snelheid ook daadwerkelijk hoog genoeg ligt.

Acties:
  • 0 Henk 'm!

Verwijderd

Wolf3D schreef op vrijdag 28 oktober 2005 @ 15:46:
[...]

Het zoeken op drieletterige woorden heeft volgens mij zeker nut. Woorden als HET en EEN zijn natuurlijk nutteloos, maar BUS of TAS of BMW moeten wel resultaten opleveren als records deze woorden bevatten.


[...]

MATCH biedt meerdere voordelen boven LIKE, waardoor ik voor deze methode gekozen heb. Misschien een combinatie van MATCH & LIKE, zoals ik hierboven ook schreef?
Ik zou alleen even niet weten hoe ik dat kan combineren...
Gewoon niet combineren, en een extra querie draaien dus een draait match en een draait like

Acties:
  • 0 Henk 'm!

  • Wolf3D
  • Registratie: Augustus 2001
  • Laatst online: 22-08 12:03
Ik ben bang dat het hele zoekgebeuren te 'zwaar' wordt en de performance van de hele website naar beneden haalt. Ik heb zelf weinig ervaring met het draaien van websites met veel bezoekers, en veel zoekende bezoekers, maar denk dat het zonde is om EN een MATCH .. AGAINST te doen EN een LIKE opdracht....

Volgens mij zou onderstaande alles oplossen ....
Arjan A schreef op vrijdag 28 oktober 2005 @ 15:30:
De minimale lengte van woorden kan je opgeven in my.cnf (ft_min_word_len), deze staat default op 3.
Als je dat naar beneden aanpast, moet je (dacht ik) MySQL herstarten, maar ook moet de tabel opnieuw geindexeerd worden (vanwege meer woorden die nu mee mogen doen). MySQL geeft volgens mij op hun website ergens wel aan dat je performance achteruit gaat. Moet je zelf maar afwegen.
Misschien toch maar eens mijn hostingprovider heeeeeel lief aankijken? :S

Acties:
  • 0 Henk 'm!

  • Arjan A
  • Registratie: November 2000
  • Laatst online: 12:24

Arjan A

Cenosillicafoob

Check even dit artikel op mysql.com:
http://dev.mysql.com/doc/...fulltext-fine-tuning.html

Je moet idd herstarten voor ft_min_word_len, maar er zullen vast meer handige tips in staan.

Canon EOS | DJI M2P
Fotoblog · Mijn werk aan jouw muur


Acties:
  • 0 Henk 'm!

  • Wolf3D
  • Registratie: Augustus 2001
  • Laatst online: 22-08 12:03
Positieve reacties van mijn hostingprovider: het is geen probleem voor ze!

Het lijkt mij het beste om een minimale woordlengte van 3 letters in te stellen. Dat is een letter meer dan nu, maar dan zijn de meeste woorden gewoon vindbaar!

Twee-letterige woorden of minder lijken mij bij nader inzien nutteloze zoektermen en zullen flink ten koste gaan van de performance indien hierop indexen moeten worden aangelegd, of zie ik een aantal belangrijke twee-letterige zoektermen over het hoofd? Marktplaats.nl ondersteunt bijvoorbeeld wel zoekopdrachten vanaf 2 letters.....
Pagina: 1