[mySQL] Zoeken met match against geen resultaat

Pagina: 1
Acties:

  • wustenveld
  • Registratie: Februari 2002
  • Laatst online: 08-08 17:31
Ik heb een tabel waar nu 25 records in staan. Nu wil ik bijvoorbeeld zoeken op het woord ziekenhuis. Met een query als deze krijg ik 18 records als resultaat:
code:
1
2
3
4
SELECT id, titel 
from paginas
where titel like '%ziekenhuis%' 
OR bodytekst like '%ziekenhuis%'


Bij de volgende query krijg ik geen resultaat:
code:
1
2
3
SELECT id,titel
FROM paginas
WHERE MATCH(titel,bodytekst) AGAINST('ziekenhuis')


Ik wil dat fulltext searchen gebruiken omdat ik dan ook booleans kan gebruiken, dus zoeken naar woordA zolang woordB er niet in voorkomt. Maar wat kan ik hier verkeerd doen. Het stomme is als ik ditzelfde geintje doe met bijvoorbeeld het woord "alleen" krijg ik in beide gevallen wel hetzelfde aantal resultaten (namelijk 3)

Verwijderd

Fulltext search heeft nogal wat speciaal gedrag, zeker met kleine aantallen. Lees de manual eens om te zien of een van de uitzonderingen van toepassing is.
Bijvoorbeeld een woord dat in meer dan de helft van de rijen voorkomt wordt genegeerd.

http://www.mysql.com/doc/en/Fulltext_Search.html

Zie ook de comments:
A clarification for those very new to mySQL:
MATCH (body,title) will only work if you have an
index on both fields together - something created
like this:
ALTER TABLE some_tbl ADD FULLTEXT (body,title);
It will not work if you have an index on each
of 'body' and 'title' separately.

[ Voor 37% gewijzigd door Verwijderd op 15-04-2003 12:01 ]


  • wustenveld
  • Registratie: Februari 2002
  • Laatst online: 08-08 17:31
Dan zou het dus komen omdat het woord "ziekenhuis" in meer dan de helft van de rijen voorkomt (totaal 25 rijen, resultaten is 18). Ik kan dus beter gewoon de like optie gebruiken voor de querys. Ik vond het namelijk wel tof dat ik een score kon meegeven aan een zoekresultaat.

In ieder geval bedankt voor de link

  • wustenveld
  • Registratie: Februari 2002
  • Laatst online: 08-08 17:31
Ik kan het volgens mij ook zo doen:
code:
1
2
3
4
select id, titel, match(titel,bodytekst) against ('ziekenhuis') as score
from paginas
where titel like '%ziekenhuis%' or
bodytekst like '%ziekenhuis%'


Ik krijg dan helaas alleen dat de score 0 is, kan ik dan wel weer vervangen door 100 maar dan heeft het eigenlijk geen nut meer, deze query is wel handig omdat als ik zoek op het woord "alleen" wél een score krijg die goed is. De tabel die doorzocht wordt is trouwens niet de enige tabel ik doorzoek ook nog een tabel met nieuws, agenda, folders, vacatures enz. Dus uiteindelijk zal het zoekresultaan van het woord ziekenhuis wel in minder dan 50% van het totaal aantal rijen voorkomen.

Is er misschien een andere 'slimme' manier om toch nog een score te krijgen nadat ik alle tabellen doorzocht heb. Ik knal alle zoekresultaten die ik krijg uit verschillende tabellen in een array die ik vervolgens sorteer op score en dan weergeef op het scherm.

Verwijderd

Je zit er niet perse aan gebonden hoor, je kan het volgende doen:
The 50% threshold is determined by the particular weighting scheme chosen. To disable it, change the following line in `myisam/ftdefs.h':
#define GWS_IN_USE GWS_PROB
To:
#define GWS_IN_USE GWS_FREQ
Then recompile MySQL. There is no need to rebuild the indexes in this case. Note: by doing this you severely decrease MySQL's ability to provide adequate relevance values for the MATCH() function. If you really need to search for such common words, it would be better to search using IN BOOLEAN MODE instead, which does not observe the 50% threshold.
http://www.mysql.com/doc/en/Fulltext_Fine-tuning.html

Hou er rekening mee dat het allemaal een stuk beter wordt bij grotere aantallen, terwijl die like queries op dat moment alleen maar achteruit gaan.

[ Voor 3% gewijzigd door Verwijderd op 15-04-2003 12:20 ]


  • wustenveld
  • Registratie: Februari 2002
  • Laatst online: 08-08 17:31
Ik kan dus in mijn geval beter like querys gebruiken, aangezien het aantal records beperkt blijft. Dan zou ik voor de score alleen dus de resultaten-array moeten afzoeken hoe vaak een bepaald woord in een tekst voor komt om op die manier aan m'n score te komen.

Ben ik dan goed bezig, of weet iemand een betere?

Verwijderd

Als het zo klein blijft is dat de enige oplossing die echt goed zal werken. Doe de like query, zet de resultaten in een array. Tel het aantal maal dat de woorden voorkomen in de array in de relevante velden per rij (in een extra veld per rij oid) en sorteer daarop.

  • wustenveld
  • Registratie: Februari 2002
  • Laatst online: 08-08 17:31
ja precies, bedankt voor het meedenken / hulp enzo.
Pagina: 1