Riepilogo :in questo tutorial imparerai come utilizzare la funzione di ricerca full-text di SQLite utilizzando il modulo tabella virtuale FTS5.
Introduzione alla ricerca full-text di SQLite
Una tabella virtuale è un'estensione personalizzata di SQLite. Un tavolo virtuale è come un tavolo normale. La differenza tra una tabella virtuale e una tabella normale è da dove provengono i dati, ad esempio, quando si elabora una tabella normale, SQLite accede al file di database per recuperare i dati. Tuttavia, quando accedi a una tabella virtuale, SQLite chiama il codice personalizzato per ottenere i dati. Il codice personalizzato può avere una logica specificata per gestire determinate attività come l'acquisizione di dati da più origini dati.
Per utilizzare la ricerca full-text in SQLite, utilizzi il modulo tabella virtuale FTS5.
Il seguente CREATE VIRTUAL TABLE
istruzione crea una tabella FTS5 con due colonne:
CREATE VIRTUAL TABLE table_name
USING FTS5(column1,column2...);
Code language: SQL (Structured Query Language) (sql)
Nota che non puoi aggiungere tipi, vincoli o PRIMARY KEY
dichiarazione nella CREATE VIRTUAL TABLE
istruzione per la creazione di una tabella FTS5. In tal caso, SQLite emetterà un errore.
Come creare una tabella normale senza specificare la colonna della chiave primaria, SQLite aggiunge un rowid
implicito colonna alla tabella FTS5.
L'esempio seguente crea una tabella FTS5 denominata posts
con due colonne title
e body
.
CREATE VIRTUAL TABLE posts
USING FTS5(title, body);
Code language: SQL (Structured Query Language) (sql)
Simile a una normale tabella, puoi inserire dati nei posts
tabella come segue:
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)
E interroga i dati su di esso:
SELECT * FROM posts;
Code language: SQL (Structured Query Language) (sql)
Interrogazione dei dati utilizzando la ricerca full-text
Puoi eseguire una query full-text su una tabella FTS5 utilizzando uno di questi tre modi.
Per prima cosa, usa un MATCH
operatore nella clausola WHERE dell'istruzione SELECT. Ad esempio, per ottenere tutte le righe che hanno il termine fts5
, utilizzi la seguente query:
SELECT *
FROM posts
WHERE posts MATCH 'fts5';
Code language: SQL (Structured Query Language) (sql)
In secondo luogo, usa un uguale (=
) nell'operatore WHERE
clausola del SELECT
dichiarazione. L'istruzione seguente restituisce lo stesso risultato dell'istruzione precedente:
SELECT *
FROM posts
WHERE posts = 'fts5';
Code language: SQL (Structured Query Language) (sql)
In terzo luogo, utilizzare una sintassi della funzione con valori di tabella. In questo modo, utilizzerai il termine di ricerca come primo argomento della tabella:
SELECT *
FROM posts('fts5');
Code language: SQL (Structured Query Language) (sql)
Per impostazione predefinita, FTS5 è indipendente dal caso. Tratta i termini fts5
FTS5
e Fts5
lo stesso.
Per ordinare i risultati della ricerca dal più al meno pertinente, utilizza la clausola ORDER BY come segue:
SELECT *
FROM posts
WHERE posts MATCH 'text'
ORDER BY rank;
Code language: SQL (Structured Query Language) (sql)
Utilizzo della sintassi delle query full-text
Una query di ricerca full-text è composta da frasi, in cui ogni frase è un elenco ordinato di uno o più token. Puoi usare l'operatore “+” per concatenare due frasi come nell'esempio seguente:
"learn SQLite"
"learn + SQLite"
Code language: SQL (Structured Query Language) (sql)
FTS5 determina se un documento corrisponde a una frase se il documento contiene almeno una sottosequenza di token che corrispondono alla sequenza di token utilizzata per costruire la frase.
La query seguente restituisce tutti i documenti che corrispondono al termine di ricerca Learn SQLite
:
SELECT *
FROM posts
WHERE posts MATCH 'learn SQLite';
Code language: SQL (Structured Query Language) (sql)
Ricerche di prefissi
È possibile utilizzare l'asterisco (*) come token di prefisso. Quando una frase contiene l'asterisco (*), corrisponderà a qualsiasi documento che contiene il token che inizia con la frase. Ad esempio, ricerca* corrisponde a ricerca, ricerca, ricerche, ecc. Vedere il seguente esempio:
SELECT *
FROM posts
WHERE posts = 'search*';
Code language: SQL (Structured Query Language) (sql)
Operatori booleani
Puoi utilizzare l'operatore booleano, ad esempio NOT
, OR
o AND
per combinare le query.
- q1 AND q2:corrisponde se entrambe le query q1 e q2 corrispondono.
- q1 OR q2:corrisponde se la query q1 o q2 corrisponde.
- q1 NOT q2:corrisponde se la query q1 corrisponde e q2 non corrisponde.
Ad esempio, per ottenere i documenti che corrispondono a learn
frase ma non corrisponde a FTS5
frase, usi il NOT
operatore come segue:
SELECT *
FROM posts
WHERE posts MATCH 'learn NOT text';
Code language: SQL (Structured Query Language) (sql)
Per cercare documenti che corrispondono a una delle due frasi learn
o text
, usi il OR
operatore come il seguente esempio:
SELECT *
FROM posts
WHERE posts MATCH 'learn OR text';
Code language: SQL (Structured Query Language) (sql)
Per trovare i documenti che corrispondono a SQLite e alla ricerca, usa AND
operatore come mostrato di seguito:
SELECT *
FROM posts
WHERE posts MATCH 'sqlite AND searching';
Code language: SQL (Structured Query Language) (sql)
Per modificare la precedenza dell'operatore, utilizzare le parentesi per raggruppare le espressioni. Ad esempio:
SELECT *
FROM posts
WHERE posts MATCH 'search AND sqlite OR help';
Code language: SQL (Structured Query Language) (sql)
L'istruzione restituisce documenti che corrispondono a search
e sqlite
o help
. Per trovare i documenti che corrispondono a search
e sqlite
o help
, usi la parentesi come segue:
SELECT *
FROM posts
WHERE posts MATCH 'search AND (sqlite OR help)';
Code language: SQL (Structured Query Language) (sql)
Funzioni ausiliarie integrate
SQLite fornisce tre funzioni ausiliarie integrate che possono essere utilizzate all'interno di query full-text sulla tabella FTS5.
- Il
bm25()
restituisce un valore che rappresenta l'accuratezza della corrispondenza corrente, il valore più basso indica una corrispondenza migliore. - Il
highlight()
la funzione ausiliaria restituisce una copia del testo con i termini di ricerca circondati da un markup specificato, ad es.termine di ricerca - Il
snippet()
seleziona un breve frammento di testo per massimizzare il numero di termini di ricerca che contiene.
Ad esempio, la query seguente utilizza la funzione highlight() per decorare i termini di ricerca utilizzando il 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)
In questo tutorial, hai imparato come utilizzare le funzionalità di ricerca full-text di SQLite tramite il modulo tabella virtuale FTS5.