Oversigt :i denne øvelse lærer du, hvordan du bruger SQLite fuldtekst søgefunktionen ved at bruge FTS5 virtuelle tabelmodulet.
Introduktion til SQLite fuldtekstsøgning
En virtuel tabel er en tilpasset udvidelse til SQLite. Et virtuelt bord er som et normalt bord. Forskellen mellem en virtuel tabel og en normal tabel er, hvor dataene kommer fra, dvs. når du behandler en normal tabel, får SQLite adgang til databasefilen for at hente data. Men når du får adgang til en virtuel tabel, kalder SQLite den tilpassede kode for at få dataene. Den brugerdefinerede kode kan have specificeret logik til at håndtere bestemte opgaver, såsom at hente data fra flere datakilder.
For at bruge fuldtekstsøgning i SQLite bruger du FTS5 virtuelt tabelmodul.
Følgende CREATE VIRTUAL TABLE
sætning opretter en FTS5-tabel med to kolonner:
CREATE VIRTUAL TABLE table_name
USING FTS5(column1,column2...);
Code language: SQL (Structured Query Language) (sql)
Bemærk, at du ikke kan tilføje typer, begrænsninger eller PRIMARY KEY
erklæringen i CREATE VIRTUAL TABLE
erklæring til oprettelse af en FTS5-tabel. Hvis du gør det, udsender SQLite en fejl.
Ligesom at oprette en normal tabel uden at angive den primære nøglekolonne, tilføjer SQLite en implicit rowid
kolonne til FTS5-tabellen.
Følgende eksempel opretter en FTS5-tabel med navnet posts
med to kolonner title
og body
.
CREATE VIRTUAL TABLE posts
USING FTS5(title, body);
Code language: SQL (Structured Query Language) (sql)
I lighed med en normal tabel kan du indsætte data i posts
tabel som følger:
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)
Og forespørg data mod det:
SELECT * FROM posts;
Code language: SQL (Structured Query Language) (sql)
Forespørgsel efter data ved hjælp af fuldtekstsøgning
Du kan udføre en fuldtekstforespørgsel mod en FTS5-tabel på en af disse tre måder.
Brug først en MATCH
operator i WHERE-udtrykket i SELECT-sætningen. For eksempel for at få alle rækker, der har udtrykket fts5
, bruger du følgende forespørgsel:
SELECT *
FROM posts
WHERE posts MATCH 'fts5';
Code language: SQL (Structured Query Language) (sql)
For det andet skal du bruge en lig (=
) operator i WHERE
klausul af SELECT
udmelding. Følgende sætning returnerer det samme resultat som sætningen ovenfor:
SELECT *
FROM posts
WHERE posts = 'fts5';
Code language: SQL (Structured Query Language) (sql)
For det tredje skal du bruge en funktionssyntaks med tabelværdier. På denne måde bruger du søgeordet som det første tabelargument:
SELECT *
FROM posts('fts5');
Code language: SQL (Structured Query Language) (sql)
Som standard er FTS5 sagsuafhængig. Den behandler termerne fts5
FTS5
og Fts5
det samme.
For at sortere søgeresultaterne fra de mest til de mindst relevante bruger du ORDER BY-klausulen som følger:
SELECT *
FROM posts
WHERE posts MATCH 'text'
ORDER BY rank;
Code language: SQL (Structured Query Language) (sql)
Brug af fuldtekstforespørgselssyntaks
En fuldtekstsøgeforespørgsel består af sætninger, hvor hver sætning er en ordnet liste over en eller flere tokens. Du kan bruge operatoren "+" til at sammenkæde to sætninger som følgende eksempel:
"learn SQLite"
"learn + SQLite"
Code language: SQL (Structured Query Language) (sql)
FTS5 bestemmer, om et dokument matcher en sætning, hvis dokumentet indeholder mindst én undersekvens af tokens, der matcher sekvensen af tokens, der bruges til at konstruere sætningen.
Følgende forespørgsel returnerer alle dokumenter, der matcher søgeordet Learn SQLite
:
SELECT *
FROM posts
WHERE posts MATCH 'learn SQLite';
Code language: SQL (Structured Query Language) (sql)
Prefikssøgninger
Du kan bruge stjernen (*) som et præfiks-token. Når en sætning indeholder stjernen (*), vil den matche ethvert dokument, der indeholder det token, der begynder med sætningen. For eksempel matcher søgning* med søgning, søgning, søgninger osv. Se følgende eksempel:
SELECT *
FROM posts
WHERE posts = 'search*';
Code language: SQL (Structured Query Language) (sql)
Boolske operatorer
Du kan bruge den boolske operator, f.eks. NOT
, OR
, eller AND
at kombinere forespørgsler.
- q1 OG q2:matcher, hvis både q1 og q2 forespørgsler matcher.
- q1 ELLER q2:matcher, hvis enten forespørgsel q1 eller q2 matcher.
- q1 IKKE q2:matcher, hvis forespørgsel q1 matcher og q2 ikke matcher.
For eksempel for at få de dokumenter, der matcher learn
sætning, men matcher ikke FTS5
sætning, bruger du NOT
operatør som følger:
SELECT *
FROM posts
WHERE posts MATCH 'learn NOT text';
Code language: SQL (Structured Query Language) (sql)
For at søge efter dokumenter, der matcher begge sætninger learn
eller text
, bruger du OR
operator som følgende eksempel:
SELECT *
FROM posts
WHERE posts MATCH 'learn OR text';
Code language: SQL (Structured Query Language) (sql)
For at finde de dokumenter, der matcher både SQLite og søgning, bruger du AND
operatør som vist nedenfor:
SELECT *
FROM posts
WHERE posts MATCH 'sqlite AND searching';
Code language: SQL (Structured Query Language) (sql)
For at ændre operatorens forrang bruger du parentes til at gruppere udtryk. For eksempel:
SELECT *
FROM posts
WHERE posts MATCH 'search AND sqlite OR help';
Code language: SQL (Structured Query Language) (sql)
Udsagnet returnerer dokumenter, der matcher search
og sqlite
eller help
. For at finde de dokumenter, der matcher search
og enten sqlite
eller help
, bruger du parentes som følger:
SELECT *
FROM posts
WHERE posts MATCH 'search AND (sqlite OR help)';
Code language: SQL (Structured Query Language) (sql)
Indbyggede hjælpefunktioner
SQLite har tre indbyggede hjælpefunktioner, der kan bruges i fuldtekstforespørgsler på FTS5-tabellen.
bm25()
returnerer en værdi, der repræsenterer nøjagtigheden af det aktuelle match, betyder den lavere værdi et bedre match.highlight()
hjælpefunktionen returnerer en kopi af teksten med søgetermer omgivet af en specificeret markering, f.eks.søgetermsnippet()
vælger et kort fragment af tekst for at maksimere antallet af søgetermer, det indeholder.
For eksempel bruger følgende forespørgsel funktionen highlight() til at dekorere søgetermerne ved hjælp af tagget:
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)
I denne øvelse har du lært, hvordan du bruger SQLite fuldtekst søgefunktioner via FTS5 virtuelt tabelmodul.