Soms wil je bij het zoeken in een MySQL-database misschien full-text zoekopdrachten uitvoeren op tekengebaseerde gegevens. Vandaag bespreken we de voor- en nadelen van dergelijke zoekmethoden.
Wat zijn zoekopdrachten in volledige tekst in MySQL?
Zoeken in volledige tekst is een techniek waarmee u kunt zoeken naar records die mogelijk niet perfect overeenkomen met de zoekcriteria. Zoekopdrachten in volledige tekst in MySQL worden uitgevoerd wanneer bepaalde indexen in gebruik zijn en die indexen veel unieke nuances hebben, waaronder de volgende:
- Om de index als een volledige tekstindex te beschouwen, moet de index van het type FULLTEXT zijn.
- FULLTEXT-indexen kunnen alleen worden gebruikt op tabellen met de InnoDB- of MyISAM-opslagengines.
- FULLTEXT-indexen kunnen alleen worden gemaakt voor CHAR-, VARCHAR- of TEXT-kolommen.
- FULLTEXT-indexen worden alleen gebruikt als de MATCH() AGAINST()-clausule wordt gebruikt.
- Zoeken in volledige tekst hebben drie modi:de natuurlijke taalmodus, de booleaanse modus en de zoekuitbreidingsmodus.
Een FULLTEXT-index is een speciaal type index dat trefwoorden in de tekst vindt in plaats van de waarden te vergelijken met de waarden in de index. Hoewel zoeken in FULLTEXT verschilt van andere soorten overeenkomsten, moet u er rekening mee houden dat u tegelijkertijd een BTREE-index en een FULLTEXT-index in dezelfde kolom kunt hebben - ze zullen niet conflicteren omdat ze geschikt zijn voor verschillende doeleinden.
Zoektypen in volledige tekst
Houd er bij het uitvoeren van zoekopdrachten in volledige tekst in MySQL rekening mee dat er drie zoektypen zijn waaruit u kunt kiezen:
- Een zoektype in natuurlijke taal - een dergelijke zoekmodus interpreteert de zoekreeks als een letterlijke zin. Standaard ingeschakeld als er geen modifier is gespecificeerd of wanneer de IN NATURAL LANGUAGE MODE modifier is gespecificeerd;
- Een zoektype voor zoekopdrachtuitbreiding - een dergelijke zoekmodus voert de zoekopdracht twee keer uit. Bij de tweede keer zoeken bevat de resultatenset enkele meest relevante documenten van de eerste zoekopdracht. Ingeschakeld met behulp van de WITH QUERY EXPANSION-modifier;
- Een booleaans zoektype - een dergelijke zoekmodus maakt het zoeken naar complexe zoekopdrachten mogelijk die booleaanse operatoren kunnen bevatten, zoals operatoren kleiner dan (“<”) en meer dan (“>”), subexpressies (“( ” en “)”)), het plusteken (+), het minteken (-), dubbele aanhalingstekens (“”), een operator die de bijdrage van de waarde aan de resultaten verlaagt (~) en de jokertekenoperator (*) - de wildcard-operator maakt zoeken met fuzzy matching mogelijk (bijvoorbeeld, "demo*" zou ook overeenkomen met "demonstratie"). Ingeschakeld met de IN BOOLEAN MODE-modifier.
Zoeken in volledige tekst met de natuurlijke taalzoekmodus
Een zoekmodus in natuurlijke taal, zoals hierboven vermeld, is standaard ingeschakeld of wanneer de modifier IN NATURAL LANGUAGE MODE is opgegeven. Deze modus voert een zoekopdracht in natuurlijke taal uit op een bepaalde tekstverzameling (een of meer kolommen). Het basisqueryformaat van full-text zoekopdrachten in MySQL zou als volgt moeten zijn:
SELECT * FROM table WHERE MATCH(column) AGAINST(“string” IN NATURAL LANGUAGE MODE);
Als MATCH() samen met een WHERE-component wordt gebruikt, worden de rijen automatisch gesorteerd op de hoogste relevantie eerst. Om een exacte tekenreeks te zoeken, plaatst u deze tussen dubbele aanhalingstekens.
Zoeken in volledige tekst met de modus Query-uitbreiding
Zoekopdrachten in volledige tekst ondersteunen ook de modus voor het uitbreiden van zoekopdrachten. Een dergelijke zoekmodus wordt vaak gebruikt wanneer de gebruiker vertrouwt op impliciete kennis - de gebruiker kan bijvoorbeeld zoeken naar "DBMS" in de hoop zowel "MongoDB" als "MySQL" in de zoekresultaten te zien. De reden waarom de gebruiker zou kunnen vertrouwen op enige impliciete kennis bij het gebruik van een dergelijke zoekmodus is vrij eenvoudig - een volledige tekst zoeken met de zoekuitbreidingsmodus werkt door de zoekopdracht twee keer uit te voeren:de tweede zoekterm is de eerste zoekterm aaneengeschakeld met enkele meest relevante items uit de eerste zoekopdracht. Dat betekent dat als bijvoorbeeld in de eerste zoekopdracht een van de rijen het woord "DBMS" en het woord "MySQL" zou bevatten, de tweede zoekopdracht de items zou vinden die het woord "MySQL" zouden bevatten, zelfs als ze niet bevatten "DBMS". De query-indeling die de zoekuitbreidingsmodus zou gebruiken, ziet er als volgt uit:
SELECT * FROM table WHERE MATCH(column) AGAINST(“string” WITH QUERY EXPANSION);
Zoeken in volledige tekst met behulp van de Booleaanse modus
De booleaanse modus is misschien wel een van de meest interessante dingen die MySQL full-text zoeken te bieden heeft. Deze modus heeft veel unieke kanttekeningen, omdat u de zoekmogelijkheden kunt uitbreiden met behulp van booleaanse operatoren. Wanneer de booleaanse modus wordt gebruikt, kunnen bepaalde tekens een speciale betekenis hebben aan het begin of einde van woorden. Bijvoorbeeld:
- “+” betekent EN;
- “-” betekent NIET;
- Met de operators "(" en ")" kunnen subexpressies worden gemaakt;
- “<” en “>” operators wijzigen de rangorde van de zoekwaarde lager of hoger;
- "~" verlaagt de bijdrage van de waarde aan de zoekresultaten;
- Dubbele aanhalingstekens (“”) komen alleen overeen met letterlijke waarden;
- “*” is een jokerteken (zie de uitleg hierboven).
Met deze operators kunt u de functionaliteit van de zoekopdracht uitbreiden:als u bijvoorbeeld alle rijen wilt ophalen die het woord 'Demo' bevatten, maar niet 'Demo2', kunt u een zoekopdracht gebruiken zoals zo:
SELECT * FROM table WHERE MATCH(column) AGAINST (“+Demo -Demo2” IN BOOLEAN MODE);
Je kunt ook dubbele aanhalingstekens samen met enkele aanhalingstekens gebruiken, zoals:
SELECT * FROM table WHERE MATCH(column) AGAINST(‘“search string”’ IN BOOLEAN MODE);
Full-Text Search Gotchas
Voordat u full-text zoeken in MySQL gebruikt, moet u er rekening mee houden dat de zoekopdracht een paar "valkuilen" heeft:
- Zowel de InnoDB- als MyISAM-opslagengines hebben hun eigen lijsten met stopwoorden. De InnoDB-stopwoordenlijst is hier te vinden, de MyISAM-stopwoordenlijst is hier te vinden.
- Als u uw eigen lijst met stopwoorden voor InnoDB wilt definiëren, definieert u een tabel met dezelfde structuur als de tabel INNODB_FT_DEFAULT_STOPWORD, voegt u daar stopwoorden in en stelt u vervolgens de waarde van de optie innodb_ft_server_stopword_table in in de vorm van db_name/table_name.
- Als u uw eigen lijst met stopwoorden voor MyISAM wilt definiëren, stelt u de variabele ft_stopword_file in op de padnaam van het bestand dat de lijst met stopwoorden bevat. In het bestand kunnen stopwoorden worden gescheiden door elk niet-alfanumeriek teken, behalve “_” en “‘“. Het standaardstopwoordbestand bevindt zich op storage/myisam/ft_static.c. Stopwoorden kunnen worden uitgeschakeld door de variabele in te stellen op een lege tekenreeks.
- Zoeken in volledige tekst worden niet ondersteund op gepartitioneerde tabellen.
- Alle kolommen in een FULLTEXT-index moeten dezelfde tekenset en sortering gebruiken.
- Zoekbewerkingen in volledige tekst behandelen de %-tekenreeks niet als een jokerteken.
Hier is nog een addertje onder het gras:u kunt er ook rekening mee houden dat de ingebouwde FULLTEXT-parser bepaalt waar woorden beginnen en eindigen door naar bepaalde tekens te kijken, inclusief de spatie (" "), komma (", ”) en punt (“.”), wat betekent dat als uw zoekreeks een of meer van die tekens bevat, de zoekresultaten mogelijk niet nauwkeurig zijn. Als uw database bijvoorbeeld 5 rijen bevat met de tekenreeks "test.demo", kan de zoekopdracht "test.demo" meer (10, 15 enz.) resultaten opleveren, waaronder "demo", "string.demo_voorbeeld" enz. omdat het gaat zoeken naar "demo" in plaats van "test.demo", dus het kan zijn dat u vastzit met veel irrelevante overeenkomsten. MySQL biedt wel een oplossing voor dit probleem als u bereid bent uw eigen plug-in in C of C++ te schrijven (zie MySQL-documentatie), maar tot die tijd kunt u niet veel doen.
De volledige lijst met de volledige tekstbeperkingen van MySQL is te zien op de documentatiepagina van MySQL.
Samenvatting
De MySQL-functie voor het doorzoeken van volledige tekst biedt een eenvoudige manier om verschillende zoektechnieken (zoeken in natuurlijke taal, zoekopdrachtuitbreiding en booleaans zoeken) te implementeren in uw toepassing met MySQL. Elk van deze zoektechnieken heeft zijn eigen kanttekeningen en elk van hen kan geschikt zijn voor verschillende doeleinden - wanneer u besluit of u full-text zoeken wilt gebruiken, houd er dan rekening mee dat dit type zoeken veel subtiliteiten heeft die uniek zijn voor zichzelf, weet dat zowel de voordelen als de nadelen van het gebruik van zoeken in volledige tekst in MySQL en kies verstandig.