Někdy můžete chtít při vyhledávání v databázi MySQL spustit fulltextové vyhledávací dotazy na znaková data. Dnes diskutujeme o výhodách a nevýhodách takových vyhledávacích metod.
Co jsou fulltextové vyhledávání v MySQL?
Fulltextové vyhledávání je technika, která umožňuje vyhledávat záznamy, které nemusí dokonale odpovídat kritériím vyhledávání. Fulltextové vyhledávání v MySQL se provádí, když se používají určité indexy a tyto indexy mají mnoho jedinečných nuancí včetně následujících:
- Aby mohl být index považován za fulltextový index, musí být index typu FULLTEXT.
- FULLTEXT indexy lze použít pouze na tabulkách se spuštěnými úložnými moduly InnoDB nebo MyISAM.
- FULLTEXT indexy lze vytvořit pouze pro sloupce CHAR, VARCHAR nebo TEXT.
- FULLTEXT indexy se používají pouze při použití klauzule MATCH() AGAINST().
- Plnotextové vyhledávání má tři režimy:režim přirozeného jazyka, booleovský režim a režim rozšíření dotazu.
FULLTEXTOVÝ index je speciální typ indexu, který vyhledá klíčová slova v textu namísto porovnávání hodnot s hodnotami v indexu. Přestože se FULLTEXTové vyhledávání liší od jiných typů shody, mějte na paměti, že můžete mít BTREE index a FULLTEXT index ve stejném sloupci současně – nebudou v konfliktu, protože jsou vhodné pro různé účely.
Typy celotextového vyhledávání
Při fulltextovém vyhledávání v MySQL mějte na paměti, že máte na výběr ze tří typů vyhledávání:
- Typ vyhledávání v přirozeném jazyce – takový režim vyhledávání interpretuje hledaný řetězec jako doslovnou frázi. Ve výchozím nastavení povoleno, pokud není zadán žádný modifikátor nebo když je zadán modifikátor V REŽIMU PŘIROZENÉHO JAZYKA;
- Typ vyhledávání s rozšířením dotazu – tento režim vyhledávání provede vyhledávání dvakrát. Při druhém vyhledávání obsahuje sada výsledků několik nejrelevantnějších dokumentů z prvního vyhledávání. Povoleno pomocí modifikátoru WITH QUERY EXPANSION;
- Booleovský typ vyhledávání – tento režim vyhledávání umožňuje vyhledávání složitých dotazů, které mohou zahrnovat logické operátory, jako jsou operátory menší než (“<”) a více než (“>”), podvýrazy (“( ” a “)”), znaménko plus (+), znaménko minus (-), dvojité uvozovky (“”), operátor, který snižuje příspěvek hodnoty k výsledkům (~) a zástupný operátor (*) – Operátor zástupných znaků umožňuje vyhledávání pomocí fuzzy shody (například „demo*“ by také odpovídalo „demonstraci“). Povoleno pomocí modifikátoru IN BOOLEAN MODE.
Plnotextové vyhledávání v režimu vyhledávání v přirozeném jazyce
Režim vyhledávání v přirozeném jazyce, jak je uvedeno výše, je povolen ve výchozím nastavení nebo je-li zadán modifikátor IN NATURAL LANGUAGE MODE. Tento režim provádí vyhledávání v přirozeném jazyce proti dané kolekci textu (jeden nebo více sloupců). Základní formát dotazu fulltextového vyhledávání v MySQL by měl být podobný následujícímu:
SELECT * FROM table WHERE MATCH(column) AGAINST(“string” IN NATURAL LANGUAGE MODE);
Když se MATCH() použije společně s klauzulí WHERE, řádky se automaticky seřadí jako první podle nejvyšší relevance. Chcete-li vyhledat přesný řetězec, uzavřete jej do dvojitých uvozovek.
Plnotextové vyhledávání s režimem rozšíření dotazu
Fulltextové vyhledávání také podporuje režim rozšíření dotazu. Takový režim vyhledávání se často používá, když se uživatel spoléhá na předpokládané znalosti – uživatel může například hledat „DBMS“ v naději, že ve výsledcích vyhledávání uvidí „MongoDB“ i „MySQL“. Důvod, proč se uživatel může při použití takového vyhledávacího režimu spolehnout na určité předpokládané znalosti, je docela jednoduchý – fulltextové vyhledávání s režimem rozšíření dotazu funguje tak, že vyhledávání provádí dvakrát:druhá hledaná fráze je první hledaná fráze spojené s několika nejrelevantnějšími položkami z prvního vyhledávání. To znamená, že pokud by například při prvním vyhledávání jeden z řádků obsahoval slovo „DBMS“ a slovo „MySQL“, druhé vyhledávání by našlo položky, které by obsahovaly slovo „MySQL“, i když neobsahují obsahovat „DBMS“. Formát dotazu, který by používal režim rozšíření dotazu o příbuzná slova, by vypadal takto:
SELECT * FROM table WHERE MATCH(column) AGAINST(“string” WITH QUERY EXPANSION);
Fulltextové vyhledávání pomocí booleovského režimu
Booleovský režim je možná jednou z nejzajímavějších věcí, které fulltextové vyhledávání MySQL nabízí. Tento režim má mnoho jedinečných výhrad, protože umožňuje rozšířit možnosti vyhledávání pomocí booleovských operátorů. Když se používá booleovský režim, určité znaky mohou mít zvláštní význam na začátku nebo na konci slov. Například:
- „+“ znamená AND;
- „-“ znamená NE;
- Operátory „(“ a „“) umožňují vytvářet podvýrazy;
- „<“ a „>“ operátory mění hodnocení hodnoty vyhledávání nižší nebo vyšší;
- „~“ snižuje příspěvek hodnoty k výsledkům vyhledávání;
- Dvojité uvozovky (“”) odpovídají pouze doslovným hodnotám;
- „*“ je zástupný operátor (viz vysvětlení výše).
Tyto operátory vám umožňují rozšířit funkce vyhledávání:pokud byste například chtěli načíst všechny řádky, které obsahují slovo „Demo“, ale ne „Demo2“, můžete použít dotaz takhle:
SELECT * FROM table WHERE MATCH(column) AGAINST (“+Demo -Demo2” IN BOOLEAN MODE);
Můžete také použít dvojité uvozovky společně s jednoduchými uvozovkami, například:
SELECT * FROM table WHERE MATCH(column) AGAINST(‘“search string”’ IN BOOLEAN MODE);
Hodnoty plného textového vyhledávání
Před použitím fulltextového vyhledávání v MySQL mějte na paměti, že vyhledávání má několik „problémů“:
- Oba úložiště InnoDB a MyISAM mají své vlastní seznamy klíčových slov. Seznam stopwords InnoDB najdete zde, seznam stopword MyISAM najdete zde.
- Chcete-li definovat svůj vlastní seznam ignorovaných slov pro InnoDB, definujte tabulku se stejnou strukturou jako tabulka INNODB_FT_DEFAULT_STOPWORD, vložte tam ignorovaná slova a poté nastavte hodnotu možnosti innodb_ft_server_stopword_table ve tvaru název_db/název_tabulky.
- Chcete-li definovat svůj vlastní seznam ignorovaných slov pro MyISAM, nastavte proměnnou ft_stopword_file na název cesty k souboru obsahujícímu seznam ignorovaných slov. V souboru mohou být ignorovaná slova oddělena libovolným nealfanumerickým znakem kromě „_“ a „„“. Výchozí soubor ignorovaných slov se nachází na adrese storage/myisam/ft_static.c. Ignorovaná slova lze deaktivovat nastavením proměnné na prázdný řetězec.
- Fulltextové vyhledávání není u dělených tabulek podporováno.
- Všechny sloupce ve FULLTEXTOVÉM indexu musí používat stejnou znakovou sadu a řazení.
- Operace fulltextového vyhledávání nepovažují řetězec % za zástupný znak.
Je tu další háček:možná budete chtít mít na paměti, že vestavěný FULLTEXTový analyzátor určuje, kde slova začínají a končí tím, že se podívá na určité znaky, včetně mezery (“ “), čárky (“, ”) a tečka (.”), což znamená, že pokud váš hledaný řetězec obsahuje jeden nebo více těchto znaků, výsledky hledání nemusí být přesné. Pokud například vaše databáze obsahuje 5 řádků s řetězcem „test.demo“, vyhledávací dotaz „test.demo“ může vrátit více (10, 15 atd.) výsledků včetně „demo“, „string.demo_example“ atd., protože bude hledat „demo“ místo „test.demo“, takže můžete uvíznout u spousty irelevantních shod. MySQL nabízí řešení tohoto problému, pokud jste ochotni napsat svůj vlastní plugin v C nebo C++ (viz dokumentace MySQL), ale do té doby toho nemůžete moc udělat.
Úplný seznam fulltextových omezení MySQL je k dispozici na stránce dokumentace MySQL.
Shrnutí
Schopnost fulltextového vyhledávání MySQL poskytuje jednoduchý způsob, jak implementovat různé vyhledávací techniky (vyhledávání v přirozeném jazyce, vyhledávání s rozšířením dotazů a booleovské vyhledávání) do vaší aplikace s MySQL. Každá z těchto vyhledávacích technik má své vlastní výhrady a každá z nich může být vhodná pro jiné účely – při rozhodování, zda použít fulltextové vyhledávání, mějte na paměti, že tento typ vyhledávání má mnoho jedinečných jemností, poznejte výhody i nevýhody využití fulltextového vyhledávání v MySQL a vyberte si moudře.