Shrnutí :v tomto tutoriálu se naučíte používat funkci fulltextového vyhledávání SQLite pomocí modulu virtuální tabulky FTS5.
Úvod do fulltextového vyhledávání SQLite
Virtuální tabulka je vlastní rozšíření SQLite. Virtuální stůl je jako normální stůl. Rozdíl mezi virtuální tabulkou a normální tabulkou je v tom, odkud data pocházejí, tj. když zpracováváte normální tabulku, SQLite přistupuje k databázovému souboru, aby načetl data. Když však přistoupíte k virtuální tabulce, SQLite zavolá vlastní kód, aby získala data. Vlastní kód může mít specifikovanou logiku pro zpracování určitých úkolů, jako je získávání dat z více zdrojů dat.
Chcete-li použít fulltextové vyhledávání v SQLite, použijte modul virtuální tabulky FTS5.
Následující CREATE VIRTUAL TABLE
příkaz vytvoří tabulku FTS5 se dvěma sloupci:
CREATE VIRTUAL TABLE table_name
USING FTS5(column1,column2...);
Code language: SQL (Structured Query Language) (sql)
Všimněte si, že nemůžete přidávat typy, omezení nebo PRIMARY KEY
deklarace v CREATE VIRTUAL TABLE
příkaz pro vytvoření tabulky FTS5. Pokud tak učiníte, SQLite vydá chybu.
Stejně jako při vytváření normální tabulky bez určení sloupce primárního klíče přidává SQLite implicitní rowid
sloupec do tabulky FTS5.
Následující příklad vytvoří tabulku FTS5 s názvem posts
se dvěma sloupci title
a body
.
CREATE VIRTUAL TABLE posts
USING FTS5(title, body);
Code language: SQL (Structured Query Language) (sql)
Podobně jako u běžné tabulky můžete vkládat data do posts
tabulka takto:
INSERT INTO posts(title,body)
VALUES('Learn SQlite FTS5','This tutorial teaches you how to perform full-text search in SQLite using FTS5'),
('Advanced SQlite Full-text Search','Show you some advanced techniques in SQLite full-text searching'),
('SQLite Tutorial','Help you learn SQLite quickly and effectively');
Code language: SQL (Structured Query Language) (sql)
A dotazujte se na data:
SELECT * FROM posts;
Code language: SQL (Structured Query Language) (sql)
Dotazování dat pomocí fulltextového vyhledávání
Fulltextový dotaz na tabulku FTS5 můžete provést jedním z těchto tří způsobů.
Nejprve použijte MATCH
operátor v klauzuli WHERE příkazu SELECT. Chcete-li například získat všechny řádky, které obsahují výraz fts5
, použijete následující dotaz:
SELECT *
FROM posts
WHERE posts MATCH 'fts5';
Code language: SQL (Structured Query Language) (sql)
Za druhé, použijte rovno (=
) v operátoru WHERE
klauzule SELECT
prohlášení. Následující příkaz vrátí stejný výsledek jako výše uvedený příkaz:
SELECT *
FROM posts
WHERE posts = 'fts5';
Code language: SQL (Structured Query Language) (sql)
Za třetí, použijte syntaxi funkce s tabulkovou hodnotou. Tímto způsobem použijete hledaný výraz jako první argument tabulky:
SELECT *
FROM posts('fts5');
Code language: SQL (Structured Query Language) (sql)
Ve výchozím nastavení je FTS5 nezávislý na velikosti písmen. Zachází s výrazy fts5
FTS5
a Fts5
totéž.
Chcete-li seřadit výsledky vyhledávání od nejvíce relevantních po nejméně relevantní, použijte klauzuli ORDER BY takto:
SELECT *
FROM posts
WHERE posts MATCH 'text'
ORDER BY rank;
Code language: SQL (Structured Query Language) (sql)
Použití syntaxe fulltextového dotazu
Dotaz fulltextového vyhledávání se skládá z frází, kde každá fráze je uspořádaný seznam jednoho nebo více tokenů. Operátor „+“ můžete použít ke zřetězení dvou frází jako v následujícím příkladu:
"learn SQLite"
"learn + SQLite"
Code language: SQL (Structured Query Language) (sql)
FTS5 určuje, zda dokument odpovídá frázi, pokud dokument obsahuje alespoň jednu podsekvenci tokenů, které odpovídají sekvenci tokenů použitých k vytvoření fráze.
Následující dotaz vrátí všechny dokumenty, které odpovídají hledanému výrazu Learn SQLite
:
SELECT *
FROM posts
WHERE posts MATCH 'learn SQLite';
Code language: SQL (Structured Query Language) (sql)
Hledání předpon
Jako předponu můžete použít hvězdičku (*). Pokud fráze obsahuje hvězdičku (*), bude se shodovat s jakýmkoli dokumentem obsahujícím token začínající frází. Například hledání* odpovídá hledání, hledání, hledání atd. Viz následující příklad:
SELECT *
FROM posts
WHERE posts = 'search*';
Code language: SQL (Structured Query Language) (sql)
Booleovské operátory
Můžete použít booleovský operátor, např. NOT
, OR
, nebo AND
kombinovat dotazy.
- q1 AND q2:odpovídá, pokud se oba dotazy q1 a q2 shodují.
- q1 NEBO q2:odpovídá, pokud se shoduje dotaz q1 nebo q2.
- q1 NOT q2:odpovídá, pokud se dotaz q1 shoduje a q2 neodpovídá.
Chcete-li například získat dokumenty, které odpovídají learn
frázi, ale neodpovídá FTS5
frázi, použijete NOT
operátor takto:
SELECT *
FROM posts
WHERE posts MATCH 'learn NOT text';
Code language: SQL (Structured Query Language) (sql)
Chcete-li vyhledat dokumenty, které odpovídají jedné z frází learn
nebo text
, použijete OR
operátor jako následující příklad:
SELECT *
FROM posts
WHERE posts MATCH 'learn OR text';
Code language: SQL (Structured Query Language) (sql)
Chcete-li najít dokumenty, které odpovídají jak SQLite, tak vyhledávání, použijte AND
operátor, jak je uvedeno níže:
SELECT *
FROM posts
WHERE posts MATCH 'sqlite AND searching';
Code language: SQL (Structured Query Language) (sql)
Chcete-li změnit prioritu operátorů, použijte k seskupení výrazů závorky. Například:
SELECT *
FROM posts
WHERE posts MATCH 'search AND sqlite OR help';
Code language: SQL (Structured Query Language) (sql)
Příkaz vrátí dokumenty, které odpovídají search
a sqlite
nebo help
. Chcete-li najít dokumenty, které odpovídají search
a buď sqlite
nebo help
, použijete závorky následovně:
SELECT *
FROM posts
WHERE posts MATCH 'search AND (sqlite OR help)';
Code language: SQL (Structured Query Language) (sql)
Vestavěné pomocné funkce
SQLite poskytuje tři vestavěné pomocné funkce, které lze použít v rámci fulltextových dotazů na tabulku FTS5.
bm25()
vrátí hodnotu, která představuje přesnost aktuální shody, nižší hodnota znamená lepší shodu.highlight()
pomocná funkce vrací kopii textu s hledanými výrazy obklopenými zadaným označením, např.hledaný výrazsnippet()
vybere krátký fragment textu, aby se maximalizoval počet hledaných výrazů, které obsahuje.
Například následující dotaz používá funkci highlight() ke zdobení hledaných výrazů pomocí tag:
SELECT highlight(posts,0, '<b>', '</b>') title,
highlight(posts,1, '<b>', '</b>') body
FROM posts
WHERE posts MATCH 'SQLite'
ORDER BY rank;
Code language: SQL (Structured Query Language) (sql)
V tomto tutoriálu jste se naučili používat funkce fulltextového vyhledávání SQLite prostřednictvím modulu virtuální tabulky FTS5.