Fulltext Search
0. Inhoudsopgave
- Wat is Fulltext search?
- Hoe te gebruiken.
- In boolean mode.
- Relevantie/score bepalen.
- Een tabel Fulltext search gereed maken.
- Wat moet je nog meer weten?
1. Wat is Fulltext search?
Je kunt met Fulltext Search zoeken op kader van belangrijkheid. Dit is dus geheel wat anders dan LIKE , aangezien dit niet op relevantie van de betreffende kolom(men) sorteert. Dat kan dus handig zijn op een forum, zoals hier ook gebruikt wordt. Fulltext Search kun je gebruiken op TEXT of (VAR)CHAR veldtype.
Om Fulltext Search te kunnen gebruiken dien je de tabellen aan te passen, door FULLTEXT (`kolom`) toe te voegen.
2. Hoe te gebruiken.
Allereerst moet je dus een tabel hebben met FULLTEXT ondersteuning. De volgende tabel gebruik ik als voorbeeld:
CREATE TABLE `voorbeeld` (
`id` smallint(5) auto_increment,
`naam` varchar(100) default '',
`quote` text,
PRIMARY KEY(`id`),
FULLTEXT (`naam`,`quote`)
) TYPE=MyISAM; |
Fulltext moet je dus op die manier invoegen in een tabel. Bij het selecteren van gegevens gebruik je MATCH() en AGAINST() .
Een voorbeeld van een query:
SELECT * FROM `voorbeeld` WHERE MATCH(`naam`,`quote`) AGAINST('Zoekcriteria');
|
Steekt vrij logisch in elkaar. Maar Fulltext Search biedt nog meer mogelijkheden, daarvoor zijn bepaalde operatoren beschikbaar.
+ |
De term met een + ervoor moet voorkomen. |
- |
De term met een - ervoor mag niet voorkomen. |
> |
Maakt een term belangrijker voor de score. |
< |
Maakt een term minder belangrijker voor de score. |
* |
Een wildcard, dus het maakt niet uit wat er dan staat. |
" " |
Iets met quotes eromheen wordt in zijn geheel gezocht. |
~ |
Zorgt voor een lagere relevantie van de betreffende term |
() |
Voegt meerdere woorden samen zodat '+(De appel groeit)' dezelfde werking heeft als '+de +appel +groeit'. Dus slechts één operator nog te gebruiken dan. |
Voorbeeld hiervan:
SELECT * FROM `voorbeeld` WHERE MATCH(`naam`,`quote`) AGAINST ('+aap -(noot mies) >"wim zus jet"' IN BOOLEAN MODE);
|
Dit wijzigt zich vanzelf, door zelf het een en ander uit te proberen.
3. In Boolean Mode.
Vanaf MySQL versie 4.0.1 kun je IN BOOLEAN MODE zoekopdracht uitvoeren. Dat wil dus zeggen dat je +, - enzovoort kan gebruiken.
SELECT * FROM `voorbeeld` WHERE MATCH(`quote`) AGAINST('+aap -noot' IN BOOLEAN MODE);
|
4. Relevantie/Score bepalen.
En je kunt nog meer, de score/relevantie bepalen. Dat kun je weervinden in de zoekfunctie van ons forum. Door AGAINST() en MATCH() tussen SELECT en FROM te zetten.
SELECT *, MATCH(`quote`) AGAINST('aap noot mies') AS `relevantie` FROM `voorbeeld` WHERE MATCH(`quote`) AGAINST('aap noot mies');
|
De relevantie, of score, komt dan in een kommagetal terug.
Dan kun je met bijvoorbeeld PHP de `relevantie` opvragen. Handig hierbij is dat je dan ook nog eens kunt sorteren op `relevantie`, gewoon met ORDER BY `relevantie` DESC/ASC .
5. Een tabel Fulltext search gereed maken.
Stel je hebt al een tabel, maar je hebt dus nog geen Fulltext ingesteld. Dan kun je deze door middel van PhpMyAdmin of handmatig instellen.
- Ga naar de betreffende tabel, en zorg dat je bij "structuur" terecht komt.
- Je ziet ergens een item met als onderwerp "Indexen".
Je kunt meerdere kolommen Fulltext meegeven, door het getal 1 te veranderen. Als je denkt dat je het goed hebt, druk op de knop Start.
- Dan selecteer je de tabellen die je fulltext wil maken, en druk je op de knop Opslaan.
- En voilá, het is gepiept.
Maar het kan ook nog anders mocht je niet over een grafische tool bezitten zoals PhpMyAdmin.
Voer gewoon heel simpel de volgende query uit (doet PhpMyAdmin in principe ook):
ALTER TABLE `voorbeeld` ADD FULLTEXT(`quote`,`naam`);
|
6. Wat moet je nog meer weten?
- Als de zoekcriteria meer dan 50% van de tabel selecteert, dan worden er geen rijen geretourneerd. Dus geen resultaten.
- Fulltext kan alleen op MyISAM tabellen.
- MATCH() is beschikbaar vanaf MySQL 3.23.23.
- Op MySQL.com vind je veel naslag over dit onderwerp.
- En als je vragen hebt kun je terecht op het forum.
- Dit is getest met MySQL 4.1.12a-nt.
|