A teljes szöveges keresés egy olyan adatbázis-technika, amely akkor is beolvassa a rekordokat, ha nem pontosan felelnek meg a keresési feltételeknek. Ez lehetővé teszi a gazdag, természetesebb nyelvű keresést, amely jobban érzi magát.
Az „adatbázis-motor” keresése teljes szöveges kereséssel az „adatbázis”, „motor” vagy „adatbázis-motor” kifejezéseket tartalmazó találatokat jeleníti meg. Ez kiküszöböli a keresési feltételekben rejlő esetleges kétértelműségeket, így továbbra is megjelennek az olyan sorok, mint „Van egy adatbázisom és egy motorom”.
A MySQL-en egyszerű kereséseket lehet végrehajtani a LIKE
operátor. Ez nem hatékony és korlátozott a funkcionalitása. A MySQL-nek általában teljes táblázatot kell végeznie a lekérdezésnek megfelelő rekordok azonosítása érdekében.
A teljes szövegű lekérdezések egy speciálisan létrehozott indexet használnak a teljesítmény javítása érdekében. Ez lehetővé teszi a MySQL számára, hogy nyomon tudja követni az adatkészletben szereplő szavakat, megkönnyítve ezzel a természetes nyelv keresését.
Teljes szövegű keresés beállítása
A teljes szöveges keresést csak olyan oszlopokkal használhatja, amelyek teljes szövegű indexet tartalmaznak. Használja a FULLTEXT
záradék CREATE TABLE
utasítások ennek beállításához, amikor beírja az adatbázis-sémát. Használhatja azzal is ALTER TABLE
keresési index hozzáadásához a meglévő oszlopokhoz.
CREATE TABLE articles(content TEXT, FULLTEXT (content)); ALTER TABLE articles ADD FULLTEXT (content);
A helyben lévő index segítségével készen áll az adatbázis lekérdezésére.
Teljes szövegű keresések használata
A teljes szöveges keresés a-val kezdődik WHERE
kikötés. Használod MATCH AGAINST
ahelyett LIKE
. Meg kell adnia az indexelt oszlopokat az egyezéshez, valamint a keresendő lekérdezést.
SELECT * FROM articles WHERE MATCH (content) AGAINST ('database engine' IN NATURAL LANGUAGE MODE);
Ez a cikkek teljes szövegű keresését hajtja végre a lekérdezés segítségével database engine
. Megadásával IN NATURAL LANGUAGE MODE
, A MySQL-t arra utasítják, hogy a lekérdezést szó szerint értelmezze, anélkül, hogy bármilyen módon feldolgozná. Ez az alapértelmezett keresési mód, ha nincs megadva.
Rendezés eredmény relevancia szerint
A teljes szövegű keresés egyik előnye, hogy lehetővé teszi a visszaküldött rekordok relevancia szerinti sorrendjét. Ez nem lehetséges törzsvásárlóval LIKE
lekérdezés. Használhatja a MATCH ... AGAINST
záradék az SQL részeként SELECT
. A visszaküldött virtuális oszlop relevancia pontszámot tartalmaz, 0-tól 1-ig, jelezve, hogy a rekord mennyire egyezik a keresési lekérdezéssel.
SELECT content, MATCH (content) AGAINST ('database engine') AS relevance FROM articles ORDER BY relevance DESC
Ez a lekérdezés először a legrelevánsabb eredményeket adja vissza. Ez segít az alkalmazásának megfelelni a felhasználói elvárásoknak arról, hogy a természetes nyelvű keresőrendszerek hogyan teljesítsenek.
A MySQL több tényező értékelésével kiszámítja a keresés szempontjából releváns pontszámokat. Ide tartozik a lekérdezésnek megfelelő rekordok száma, valamint a lekérdezések egyes rekordokban való előfordulásának száma. A lekérdezésnek több pontos egyezéssel járó eredménye magasabb lesz, mint amely csak a lekérdezés egy részét tartalmazza.
Használat során MATCH ... AGAINST
a SELECT
utasítás, akkor nem kell megismételnie a WHERE
kikötés. Manuálisan szűrheti az eredményeket, és csak olyan rekordokat vehet fel, amelyek relevancia pontszáma nem nulla.
SELECT content, MATCH (content) AGAINST ('database engine') AS relevance FROM articles WHERE relevance > 0 ORDER BY relevance DESC
Lekérdezés kiterjesztési mód
A természetes nyelv nem az egyetlen támogatott teljes szövegű keresési mód. A lekérdezés bővítési mód egy olyan alternatíva, amely segít kiszélesíteni a keresési eredmények körét. Automatikusan súlyozza a keresési lekérdezést a legrelevánsabb kifejezésekhez.
A kiterjesztett keresés a lekérdezés egyezését tartalmazó rekordok felkutatásával kezdődik. Ezeket a rekordokat ezután ellenőrizzük, hogy meghatározzuk a legrelevánsabb szavakat. Ezután az adatbázis fut egy másik keresést, ezúttal az eredeti lekérdezés helyett a releváns szavakra alapozva. Ez általában azt eredményezi, hogy több rekordot adnak vissza, miközben a relevancia elfogadható mértékű.
Így engedélyezheti a lekérdezés-bővítési módot:
SELECT * FROM articles WHERE MATCH (content) AGAINST ('database engine' WITH QUERY EXPANSION)
Logikai mód
A végső teljes szöveges keresési mód logikai mód. Ez lehetővé teszi logikai módosítók felvételét a lekérdezésbe. Akkor használhatja ezt az üzemmódot, ha az egyező logika fokozott ellenőrzésére van szüksége.
Megkövetelheti, hogy minden szóban szerepeljen egy szó, ha előtaggal látja el +
. Használat -
kizárni a szót tartalmazó eredményeket. Egyéb üzemeltetők használható szavak részeinek egyeztetésére, részkifejezések létrehozására és szavak készítésére csökkenteni a relevancia pontszám. Ez utóbbi hasznos lehet a „zaj” kifejezések maszkolásakor. Ha nem ad meg operátort, az implicit módon a szóra lesz hivatkozva a lekérdezésben a OR
.
SELECT * FROM articles WHERE MATCH (content) AGAINST ('+data* engine -sqlite' IN BOOLEAN MODE)
Ez a lekérdezés legalább egy szóval kezdődő cikkeket jelenít meg data
hol sqlite
nem említik. Minden eredmény tartalmazhatja a szót engine
.
A logikai mód lehetővé teszi, hogy hatékony kereséseket állítson össze a saját logikája segítségével. Az egyik megjegyzés, hogy nem támogatja a keresési relevancia pontozását. Ez a kompromisszum, amely lehetővé teszi a felhasználók számára, hogy logikai kereséseket végezzenek. Az eredmény rangsorolása nem biztos, hogy megfelel az emberi elvárásoknak.
A teljes szöveges keresés konfigurálása
A MySQL számos teljes szövegű konfigurációs opcióval rendelkezik, amelyek lehetővé teszik a keresés finomhangolását. Íme néhány a legfontosabbak közül.
innodb_ft_min_token_size
– Beállítja az indexelt kifejezések minimális szóhosszát. Az ennél az értéknél kevesebb karakterrel rendelkező szavak nem kerülnek hozzáadásra az indexhez, így nem tud majd rájuk keresni. Az alapértelmezett érték:3
, amely kizárja a rendkívül elterjedt szavakat, mint pla
,an
ésI
. Ez a beállítás az InnoDB táblákra vonatkozik; használatft_min_word_len
a MyISAM számára.innodb_ft_max_token_size
– Hasonlóaninnodb_ft_min_token_size
, ez állítja be a maximális indexelt szavak hossza. A hosszabb szavak nem lesznek kereshetők. Használatft_max_word_len
a MyISAM táblákhoz.innodb_ft_enable_stopword
– Ez a beállítás, alapértelmezés szerint be van kapcsolva, lehetővé teszi annak szabályozását, hogy a MySQL kiszűri-e a „stopwords” szót. A stopszavak nagyon gyakran használt szavak, amelyek indokolatlanul befolyásolhatják a keresési eredményeket. Az alapértelmezett stopword lista 36 gyakori kifejezést tartalmaz.innodb_ft_user_stopword_table
– Ezt az értéket beállíthatja egy adatbázis-tábla nevére, amelyből a MySQL-nek kell a forrásszavak listáját forrnia. Ennek a táblának egynek kell lennieVARCHAR
oszlop nevűvalue
. Adja hozzá a kulcsszavakat, hogy kizárja rekordként ebben a táblázatban.
Ezek a beállítások általában a MySQL szerver konfigurációs fájljában vannak megadva. A hely platformonként változik; gyakran megtalálható itt: /etc/mysql/my.cnf
. A beállítások módosítása után újra kell indítania a MySQL szolgáltatást.
Miután a kiszolgáló biztonsági másolatot készített, állítsa vissza a táblázat teljes szövegű indexeit. Ezt meg kell tennie, hogy az adatok újraindexelésre kerüljenek a jelenlegi konfiguráció segítségével. Ellenkező esetben a korábban indexelt adatok továbbra is felhasználásra kerülnek.
InnoDB tábla reindexeléséhez futtassa OPTIMIZE TABLE my_table
. A MyISAM táblákhoz használja REPAIR TABLE my_table QUICK
. A keresési indexeket ezután újjáépítik, így a konfigurációs módosítások életbe lépnek.
Összegzés
A MySQL teljes szöveges keresése engedélyezve van a FULLTEXT
indexelje a kereshető mezőkhöz. Ezután használja MATCH ... AGAINST
a három keresési mód egyikével az eredmények elérése érdekében. A természetes nyelvű lekérdezések egy keresési relevancia pontszámot adnak vissza, amelyet felhasználhat az eredmények rangsorolásához.
A teljes szöveges keresés hatékonyabb keresési magatartást kínál, mint a LIKE
nyilatkozat. Sokkal teljesítményesebb is, különösen nagy adatkészleteknél, mivel az összes szöveget előre indexelik.