Fulltext Index in MySQL

  1. Inleiding
  2. Zoeken in een MySQL database
  3. Werking van de FULLTEXT index
  4. Relevantie bij een FULLTEXT zoekopdracht.
  5. Boolean FULLTEXT zoekopdrachten
  6. FULLTEXT Query Expansion
  7. Slotwoord en referenties
  8. Reacties op deze tutorial

Boolean FULLTEXT zoekopdrachten

Eerder in deze tutorial hebben we gezien hoe we een full-text zoekopdracht kunnen uitvoeren, wat relevantie is en hoe dat principe gebruikt wordt bij full-text zoekopdrachten. Nu is het tijd om wat dieper in te gaan op de zoekopdrachten zelf.

We hebben al enkele voorbeelden gezien van full-text zoekopdrachten waarin we hebben gezocht naar een bepaald woord of naar een gedeelte van een zin. Uit die voorbeelden is gebleken dat MySQL elk woord uit de zoekopdracht apart beoordeeld en uiteindelijk een bepaalde relevantie aan een rij koppelt. Afhankelijk van die relevantie wordt een resultaat wel of niet weergegeven.

Boolean full-text zoekopdrachten
Alle zoekopdrachten die we tot nu toe gezien hebben waren heel algemeen. Echter kunnen we met behulp van de IN BOOLEAN MODE modifier onze zoekopdrachten verder specificeren. Zo kunnen we bijvoorbeeld bepalen welke zoekwoorden wel of niet in het resultaat voor mogen komen en kunnen we bepalen welke gevonden woorden belangrijker zijn dan andere.

Laten we beginnen met een voorbeeld waarin we op zoek gaan naar titels waarin wel 'MySQL' voorkomt maar geen 'YourSQL':
Code
1
2
3
4
SELECT *
FROM artikelen
WHERE MATCH (titel)
AGAINST ('+MySQL -YourSQL' IN BOOLEAN MODE)

Deze query levert het volgende resultaat:
Code
1
2
3
4
5
6
7
8
9
+----+-------------------------------------+------------------------------------------+
| id | titel                               | inhoud                                   |
+----+-------------------------------------+------------------------------------------+
|  1 | MySQL Tutorial                      | DBMS staat voor DataBase ...             |
|  2 | MySQL op een goede manier gebruiken | Nadat je de volgende stappen ...         |
|  3 | MySQL Optimaliseren                 | In deze tutorial zal ik laten zien ...   |
|  4 | 1001 MySQL tips                     | 1. Start MySQL nooit als root 2. ...     |
|  6 | MySQL veiligheid                    | Als je MySQL goed geinstalleerd hebt ... |
+----+-------------------------------------+------------------------------------------+

Zoals we zien ontbreekt de rij met de titel 'MySQL vs. YourSQL' uit de resultaat-set. We hebben immers aangegeven geen resultaten te willen zien waarin 'YourSQL' voorkomt.

Eigenschappen van boolean full-text zoekopdrachten
De boolean full-text zoekopdrachten hebben andere eigenschappen dan normale full-text zoekopdrachten. Deze eigenschappen zijn de volgende:
  • De 50% grens wordt niet gebruikt.
  • De resultaten worden niet automatisch gesorteerd op relevantie.
  • Deze zoekopdrachten werken ook als er geen FULLTEXT index bestaat. Ze zijn dan wel vrij traag.
  • De minimale woordlengte van 4 tekens wordt gehanteerd.
  • Woorden uit de stopwoordenlijst worden genegeerd.

Operators
Er zijn verschillende operators die je kunt gebruiken in een boolean full-text zoekopdracht. Met deze operators kun je je zoekopdracht op allerlei wijzen specificeren:
  • + Het woord moet aanwezig zijn in elke gevonden rij.
  • - Het woord mag niet voorkomen in een gevonden resultaat.
  • > Het volgende woord krijgt een hogere zoekscore als het gevonden wordt.
  • < Het volgende woord krijgt een lagere zoekscore als het gevonden wordt.
  • () Groeperen woorden in een subexpressie.
  • ~ Het volgende woord krijgt een negatieve zoekscore en draagt dus negatief bij aan de relevantie.
  • " Een zinsdeel tussen dubbel quotes moet letterlijk in het resultaat voorkomen.
  • * Fungeert als wildcard. Een resultaat wordt gevonden als een woord begint met het woord voorafgaand aan deze operator.

Voorbeelden
Veel meer valt er eigenlijk niet uit te leggen over de boolean full-text zoekfunctie. Om verder te verduidelijke hoe deze zoekfunctie werkt zal ik een aantal voorbeelden geven.

Ik zal in deze voorbeelden verder alleen de WHERE clausule van de queries tonen, de rest van de query blijft toch telkens hetzelfde. Van elk voorbeeld zal ik ook het resultaat tonen die de query terug geeft.

Voorbeeld 1: geen operators
Code
1
2
MATCH (inhoud)
AGAINST ('mysql root' IN BOOLEAN MODE)

Deze query vindt rijen die op z'n minst een van beide woorden bevatten:
Code
1
2
3
4
5
6
+----+------------------+------------------------------------------+
| id | titel            | inhoud                                   |
+----+------------------+------------------------------------------+
|  4 | 1001 MySQL tips  | 1. Start MySQL nooit als root 2. ...     |
|  6 | MySQL veiligheid | Als je MySQL goed geinstalleerd hebt ... |
+----+------------------+------------------------------------------+

Voorbeeld 2: +mysql +root
Code
1
2
MATCH (inhoud)
AGAINST ('+mysql +root' IN BOOLEAN MODE)

Deze query vindt rijen waarin beide woorden voorkomen.
Code
1
2
3
4
5
+----+-----------------+--------------------------------------+
| id | titel           | inhoud                               |
+----+-----------------+--------------------------------------+
|  4 | 1001 MySQL tips | 1. Start MySQL nooit als root 2. ... |
+----+-----------------+--------------------------------------+

Voorbeeld 3: +mysql root
Code
1
2
MATCH (inhoud)
AGAINST ('+mysql root' IN BOOLEAN MODE)

Deze query vindt alle rijen waarin 'mysql' voorkomt. Rijen met daarnaast ook 'root' krijgen een hogere relevantie:
Code
1
2
3
4
5
6
+----+------------------+------------------------------------------+-----------------+
| id | titel            | inhoud                                   | score           |
+----+------------------+------------------------------------------+-----------------+
|  4 | 1001 MySQL tips  | 1. Start MySQL nooit als root 2. ...     | 1.3333333730698 |
|  6 | MySQL veiligheid | Als je MySQL goed geinstalleerd hebt ... |               1 |
+----+------------------+------------------------------------------+-----------------+

Voorbeeld 4: +mysql -root
Code
1
2
MATCH (inhoud)
AGAINST ('+mysql -root' IN BOOLEAN MODE)

Vindt alle rijen met 'mysql' maar zonder 'root':
Code
1
2
3
4
5
+----+------------------+------------------------------------------+
| id | titel            | inhoud                                   |
+----+------------------+------------------------------------------+
|  6 | MySQL veiligheid | Als je MySQL goed geinstalleerd hebt ... |
+----+------------------+------------------------------------------+

Voorbeeld 5: +mysql ~root
Code
1
2
MATCH (inhoud)
AGAINST ('+mysql ~root' IN BOOLEAN MODE)

Vindt alle rijen met 'mysql'. Rijen waarin ook 'root' voorkomt worden lager gewaardeerd:
Code
1
2
3
4
5
6
+----+------------------+------------------------------------------+------------------+
| id | titel            | inhoud                                   | score            |
+----+------------------+------------------------------------------+------------------+
|  4 | 1001 MySQL tips  | 1. Start MySQL nooit als root 2. ...     | 0.83333331346512 |
|  6 | MySQL veiligheid | Als je MySQL goed geinstalleerd hebt ... |                1 |
+----+------------------+------------------------------------------+------------------+

Voorbeeld 6: +mysql +(>goed <nooit)
Code
1
2
MATCH (inhoud)
AGAINST ('+mysql +(>goed <nooit)' IN BOOLEAN MODE)

Vindt alle rijen met 'mysql' en ofwel 'goed' of 'nooit'. Rijen met 'goed' worden hoger gewaardeerd en rijen met 'nooit' lager:
Code
1
2
3
4
5
6
+----+------------------+------------------------------------------+------------------+
| id | titel            | inhoud                                   | score            |
+----+------------------+------------------------------------------+------------------+
|  4 | 1001 MySQL tips  | 1. Start MySQL nooit als root 2. ...     | 0.83333337306976 |
|  6 | MySQL veiligheid | Als je MySQL goed geinstalleerd hebt ... |             1.25 |
+----+------------------+------------------------------------------+------------------+

Voorbeeld 7: data*
Code
1
2
MATCH (inhoud)
AGAINST ('data*' IN BOOLEAN MODE)

Vindt alle rijen met woorden die beginnen met 'data':
Code
1
2
3
4
5
6
+----+-------------------+------------------------------------------+
| id | titel             | inhoud                                   |
+----+-------------------+------------------------------------------+
|  1 | MySQL Tutorial    | DBMS staat voor DataBase ...             |
|  5 | MySQL vs. YourSQL | In de volgende database vergelijking ... |
+----+-------------------+------------------------------------------+

Voorbeeld 8: "staat voor database"
Code
1
2
MATCH (inhoud)
AGAINST ('"staat voor database"' IN BOOLEAN MODE)

Vindt alle rijen waarin letterlijk 'staat voor database' voorkomt:
Code
1
2
3
4
5
+----+----------------+------------------------------+
| id | titel          | inhoud                       |
+----+----------------+------------------------------+
|  1 | MySQL Tutorial | DBMS staat voor DataBase ... |
+----+----------------+------------------------------+

Vorige Volgende