Voor kleine tabelletjes met weinig data gebruikte ik als zoek-query vaak iets als dit:
Maar nu heb ik een hele zooi grote lappen tekst die doorzocht moeten kunnen worden. Heb de MySQL docs erop nageslagen en heb een tabel met een FULLTEXT index gemaakt op drie velden (titel, tekst en steekwoorden). Die steekwoorden zitten erbij om nog extra woorden op te kunnen geven waar het betreffende record op gevonden kan worden.
Met onderstaand commando heb ik m'n table gedefineerd:
Hierna heb ik er even 2 testrecords in gegooid (sorry voor de layout verneuking):
De MySQL documentatie zegt:
Maar die levert een empty set
Na het weghalen van de WHERE-clause, krijg ik dit resultaat:
Oftewel, hij matched niet, terwijl het eerste record toch echt het woord 'woorden' bevat. Ik doe vast iets heel doms, maar ik zie niet wat
Oh ja:
Weet niet of dat nog uitmaakt, lijkt me in ieder geval niet.
code:
1
2
3
4
| SELECT id,
naam
FROM teksten
WHERE omschrijving LIKE '%blaat%'; |
Maar nu heb ik een hele zooi grote lappen tekst die doorzocht moeten kunnen worden. Heb de MySQL docs erop nageslagen en heb een tabel met een FULLTEXT index gemaakt op drie velden (titel, tekst en steekwoorden). Die steekwoorden zitten erbij om nog extra woorden op te kunnen geven waar het betreffende record op gevonden kan worden.
Met onderstaand commando heb ik m'n table gedefineerd:
code:
1
2
3
4
5
6
7
8
9
10
11
| CREATE TABLE paginas (
id INT AUTO_INCREMENT NOT NULL,
titel VARCHAR(200),
tekst TEXT,
steekwoorden TINYTEXT,
menu INT,
categorie INT,
locatie VARCHAR(200),
PRIMARY KEY (id),
FULLTEXT (titel, tekst, steekwoorden)
); |
Hierna heb ik er even 2 testrecords in gegooid (sorry voor de layout verneuking):
code:
1
2
3
4
5
6
7
| SELECT * FROM paginas; +----+---------------------------------+-------------------------------------------------------------------+-----------------------+------+-----------+--------------------------------+ | id | titel | tekst | steekwoorden | menu | categorie | locatie | +----+---------------------------------+-------------------------------------------------------------------+-----------------------+------+-----------+--------------------------------+ | 1 | Dit is een titel | En hier hebben we de tekst. Die bevat wat woorden. | steekwoord woordsteek | 1 | 1 | direcotry/filename.extensie | | 2 | Woei, nog een titel. Echt gaaf. | Zeker wel. Dit is tekst, dat je het even weet. Lorem ipsum. Enzo. | lerp melp | 1 | 1 | directory2/filename2.extensie2 | +----+---------------------------------+-------------------------------------------------------------------+-----------------------+------+-----------+--------------------------------+ |
De MySQL documentatie zegt:
Okee, dat ga ik dus toepassen op mijn tabelletje:Full-text searching is performed with the MATCH() function.
code:
1 2mysql> SELECT * FROM articles -> WHERE MATCH (title,body) AGAINST ('database');
code:
1
2
3
4
5
| SELECT id,
titel,
MATCH(titel,tekst,steekwoorden) AGAINST('woorden')
FROM paginas
WHERE MATCH(titel,tekst,steekwoorden) AGAINST('woorden'); |
Maar die levert een empty set
Na het weghalen van de WHERE-clause, krijg ik dit resultaat:
code:
1
2
3
4
5
6
| +----+---------------------------------+----------------------------------------------------+
| id | titel | MATCH(titel,tekst,steekwoorden) AGAINST('woorden') |
+----+---------------------------------+----------------------------------------------------+
| 1 | Dit is een titel | 0 |
| 2 | Woei, nog een titel. Echt gaaf. | 0 |
+----+---------------------------------+----------------------------------------------------+ |
Oftewel, hij matched niet, terwijl het eerste record toch echt het woord 'woorden' bevat. Ik doe vast iets heel doms, maar ik zie niet wat
Oh ja:
code:
1
| mysql Ver 11.16 Distrib 3.23.49, for redhat-linux-gnu (i386) |
Weet niet of dat nog uitmaakt, lijkt me in ieder geval niet.