Резюме :в този урок ще научите как да използвате функцията за пълнотекстово търсене на SQLite, като използвате модула за виртуална таблица FTS5.
Въведение в пълнотекстово търсене на SQLite
Виртуалната таблица е персонализирано разширение към SQLite. Виртуалната маса е като нормална маса. Разликата между виртуална таблица и нормална таблица е откъде идват данните, т.е., когато обработвате нормална таблица, SQLite осъществява достъп до файла на базата данни, за да извлече данни. Въпреки това, когато имате достъп до виртуална таблица, SQLite извиква персонализирания код, за да получи данните. Персонализираният код може да има определена логика за обработка на определени задачи, като например получаване на данни от множество източници на данни.
За да използвате пълнотекстово търсене в SQLite, използвате модул за виртуална таблица FTS5.
Следният CREATE VIRTUAL TABLE
оператор създава FTS5 таблица с две колони:
CREATE VIRTUAL TABLE table_name
USING FTS5(column1,column2...);
Code language: SQL (Structured Query Language) (sql)
Забележете, че не можете да добавяте типове, ограничения или PRIMARY KEY
декларация в CREATE VIRTUAL TABLE
изявление за създаване на таблица FTS5. Ако го направите, SQLite ще издаде грешка.
Подобно на създаването на нормална таблица, без да се посочва колоната с първичен ключ, SQLite добавя имплицитен rowid
колона към таблицата FTS5.
Следващият пример създава FTS5 таблица с име posts
с две колони title
и body
.
CREATE VIRTUAL TABLE posts
USING FTS5(title, body);
Code language: SQL (Structured Query Language) (sql)
Подобно на нормална таблица, можете да вмъквате данни в posts
таблица, както следва:
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)
И потърсете данни срещу него:
SELECT * FROM posts;
Code language: SQL (Structured Query Language) (sql)
Запитване на данни чрез пълнотекстово търсене
Можете да изпълните заявка за пълен текст срещу FTS5 таблица, като използвате един от тези три начина.
Първо, използвайте MATCH
оператор в клаузата WHERE на израза SELECT. Например, за да получите всички редове, които имат термина fts5
, използвате следната заявка:
SELECT *
FROM posts
WHERE posts MATCH 'fts5';
Code language: SQL (Structured Query Language) (sql)
Второ, използвайте равен (=
) оператор в WHERE
клауза на SELECT
изявление. Следното изявление връща същия резултат като изявлението по-горе:
SELECT *
FROM posts
WHERE posts = 'fts5';
Code language: SQL (Structured Query Language) (sql)
Трето, използвайте синтаксис на функцията с таблична стойност. По този начин използвате думата за търсене като първи аргумент на таблицата:
SELECT *
FROM posts('fts5');
Code language: SQL (Structured Query Language) (sql)
По подразбиране FTS5 не зависи от регистъра. Той третира термините fts5
FTS5
и Fts5
същото.
За да сортирате резултатите от търсенето от най-уместните към най-малко подходящи, използвате клаузата ORDER BY, както следва:
SELECT *
FROM posts
WHERE posts MATCH 'text'
ORDER BY rank;
Code language: SQL (Structured Query Language) (sql)
Използване на синтаксис на заявка за пълен текст
Пълнотекстова заявка за търсене се състои от фрази, където всяка фраза е подреден списък от един или повече символи. Можете да използвате оператора „+“, за да свържете две фрази като следния пример:
"learn SQLite"
"learn + SQLite"
Code language: SQL (Structured Query Language) (sql)
FTS5 определя дали даден документ съвпада с фраза, ако документът съдържа поне една подпоредица от токени, които съответстват на последователността от токени, използвани за конструиране на фразата.
Следната заявка връща всички документи, които съответстват на думата за търсене Learn SQLite
:
SELECT *
FROM posts
WHERE posts MATCH 'learn SQLite';
Code language: SQL (Structured Query Language) (sql)
Търсене на префикс
Можете да използвате звездичката (*) като маркер за префикс. Когато фраза съдържа звездичката (*), тя ще съответства на всеки документ, който съдържа токена, който започва с фразата. Например, search* съвпада с търсене, търсене, търсения и т.н. Вижте следния пример:
SELECT *
FROM posts
WHERE posts = 'search*';
Code language: SQL (Structured Query Language) (sql)
Булеви оператори
Можете да използвате булевия оператор, например NOT
, OR
, или AND
за комбиниране на заявки.
- q1 И q2:съвпада, ако и двете заявки q1 и q2 съвпадат.
- q1 ИЛИ q2:съвпада, ако една заявка q1 или q2 съвпада.
- q1 НЕ q2:съвпада, ако заявката q1 съвпада и q2 не съвпада.
Например, за да получите документите, които съответстват на learn
фраза, но не съответства на FTS5
фраза, използвате NOT
оператор, както следва:
SELECT *
FROM posts
WHERE posts MATCH 'learn NOT text';
Code language: SQL (Structured Query Language) (sql)
За да търсите документи, които съответстват на някоя от фразата learn
или text
, използвате OR
оператор като следния пример:
SELECT *
FROM posts
WHERE posts MATCH 'learn OR text';
Code language: SQL (Structured Query Language) (sql)
За да намерите документите, които съответстват както на SQLite, така и на търсене, използвате AND
оператор, както е показано по-долу:
SELECT *
FROM posts
WHERE posts MATCH 'sqlite AND searching';
Code language: SQL (Structured Query Language) (sql)
За да промените приоритета на оператора, използвате скоби за групиране на изрази. Например:
SELECT *
FROM posts
WHERE posts MATCH 'search AND sqlite OR help';
Code language: SQL (Structured Query Language) (sql)
Инструкцията връща документи, които отговарят на search
и sqlite
или help
. За да намерите документите, които отговарят на search
и sqlite
или help
, използвате скоби, както следва:
SELECT *
FROM posts
WHERE posts MATCH 'search AND (sqlite OR help)';
Code language: SQL (Structured Query Language) (sql)
Вградени помощни функции
SQLite предоставя три вградени спомагателни функции, които могат да се използват в рамките на пълнотекстови заявки в таблицата FTS5.
bm25()
връща стойност, която представлява точността на текущото съвпадение, по-ниската стойност означава по-добро съвпадение.highlight()
спомагателната функция връща копие на текста с думи за търсене, заобиколени от определена маркировка, напр.търсенна думаsnippet()
избира кратък фрагмент от текст, за да увеличи максимално броя на думите за търсене, които съдържа.
Например следната заявка използва функцията highlight(), за да украси думите за търсене с помощта на тага:
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)
В този урок научихте как да използвате функциите за пълнотекстово търсене на SQLite чрез модула за виртуална таблица FTS5.