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 (php)
PHP script in nieuw venster Selecteer het PHP script
1
2
3
4
SELECT *
FROM artikelen
WHERE MATCH (titel)
AGAINST ('+MySQL -YourSQL' IN BOOLEAN MODE)

Deze query levert het volgende resultaat:
Code (php)
PHP script in nieuw venster Selecteer het PHP script
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 (php)
PHP script in nieuw venster Selecteer het PHP script
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 (php)
PHP script in nieuw venster Selecteer het PHP script
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 (php)
PHP script in nieuw venster Selecteer het PHP script
1
2
MATCH (inhoud)
AGAINST ('+mysql +root' IN BOOLEAN MODE)

Deze query vindt rijen waarin beide woorden voorkomen.
Code (php)
PHP script in nieuw venster Selecteer het PHP script
1
2
3
4
5
+----+-----------------+--------------------------------------+
| id | titel           | inhoud                               |
+----+-----------------+--------------------------------------+
|  4 | 1001 MySQL tips | 1. Start MySQL nooit als root 2. ... |
+----+-----------------+--------------------------------------+

Voorbeeld 3: +mysql root
Code (php)
PHP script in nieuw venster Selecteer het PHP script
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 (php)
PHP script in nieuw venster Selecteer het PHP script
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 (php)
PHP script in nieuw venster Selecteer het PHP script
1
2
MATCH (inhoud)
AGAINST ('+mysql -root' IN BOOLEAN MODE)

Vindt alle rijen met 'mysql' maar zonder 'root':
Code (php)
PHP script in nieuw venster Selecteer het PHP script
1
2
3
4
5
+----+------------------+------------------------------------------+
| id | titel            | inhoud                                   |
+----+------------------+------------------------------------------+
|  6 | MySQL veiligheid | Als je MySQL goed geinstalleerd hebt ... |
+----+------------------+------------------------------------------+

Voorbeeld 5: +mysql ~root
Code (php)
PHP script in nieuw venster Selecteer het PHP script
1
2
MATCH (inhoud)
AGAINST ('+mysql ~root' IN BOOLEAN MODE)

Vindt alle rijen met 'mysql'. Rijen waarin ook 'root' voorkomt worden lager gewaardeerd:
Code (php)
PHP script in nieuw venster Selecteer het PHP script
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 (php)
PHP script in nieuw venster Selecteer het PHP script
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 (php)
PHP script in nieuw venster Selecteer het PHP script
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 (php)
PHP script in nieuw venster Selecteer het PHP script
1
2
MATCH (inhoud)
AGAINST ('data*' IN BOOLEAN MODE)

Vindt alle rijen met woorden die beginnen met 'data':
Code (php)
PHP script in nieuw venster Selecteer het PHP script
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 (php)
PHP script in nieuw venster Selecteer het PHP script
1
2
MATCH (inhoud)
AGAINST ('"staat voor database"' IN BOOLEAN MODE)

Vindt alle rijen waarin letterlijk 'staat voor database' voorkomt:
Code (php)
PHP script in nieuw venster Selecteer het PHP script
1
2
3
4
5
+----+----------------+------------------------------+
| id | titel          | inhoud                       |
+----+----------------+------------------------------+
|  1 | MySQL Tutorial | DBMS staat voor DataBase ... |
+----+----------------+------------------------------+

« Lees de omschrijving en reacties

Inhoudsopgave

  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

PHP tutorial opties

 
 

Om de gebruiksvriendelijkheid van onze website en diensten te optimaliseren maken wij gebruik van cookies. Deze cookies gebruiken wij voor functionaliteiten, analytische gegevens en marketing doeleinden. U vindt meer informatie in onze privacy statement.