Resumo :neste tutorial, você aprenderá a usar o recurso de pesquisa de texto completo do SQLite usando o módulo de tabela virtual FTS5.
Introdução à pesquisa de texto completo SQLite
Uma tabela virtual é uma extensão personalizada do SQLite. Uma mesa virtual é como uma mesa normal. A diferença entre uma tabela virtual e uma tabela normal é de onde vêm os dados, ou seja, quando você processa uma tabela normal, o SQLite acessa o arquivo do banco de dados para recuperar os dados. No entanto, quando você acessa uma tabela virtual, o SQLite chama o código personalizado para obter os dados. O código personalizado pode ter uma lógica especificada para lidar com determinadas tarefas, como obter dados de várias fontes de dados.
Para usar a pesquisa de texto completo no SQLite, você usa o módulo de tabela virtual FTS5.
O seguinte
CREATE VIRTUAL TABLE
declaração cria uma tabela FTS5 com duas colunas:CREATE VIRTUAL TABLE table_name
USING FTS5(column1,column2...);
Code language: SQL (Structured Query Language) (sql)
Observe que você não pode adicionar tipos, restrições ou
PRIMARY KEY
declaração no CREATE VIRTUAL TABLE
instrução para criar uma tabela FTS5. Se você fizer isso, o SQLite emitirá um erro. Como criar uma tabela normal sem especificar a coluna de chave primária, o SQLite adiciona um
rowid
implícito coluna para a tabela FTS5. O exemplo a seguir cria uma tabela FTS5 chamada
posts
com duas colunas title
e body
. CREATE VIRTUAL TABLE posts
USING FTS5(title, body);
Code language: SQL (Structured Query Language) (sql)
Semelhante a uma tabela normal, você pode inserir dados nas
posts
tabela da seguinte forma: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 consulte os dados nele:
SELECT * FROM posts;
Code language: SQL (Structured Query Language) (sql)
Consultando dados usando pesquisa de texto completo
Você pode executar uma consulta de texto completo em uma tabela FTS5 usando uma dessas três maneiras.
Primeiro, use um
MATCH
operador na cláusula WHERE da instrução SELECT. Por exemplo, para obter todas as linhas que possuem o termo fts5
, você usa a seguinte consulta:SELECT *
FROM posts
WHERE posts MATCH 'fts5';
Code language: SQL (Structured Query Language) (sql)
Segundo, use um igual (
=
) no operador WHERE
cláusula do SELECT
demonstração. A instrução a seguir retorna o mesmo resultado da instrução acima:SELECT *
FROM posts
WHERE posts = 'fts5';
Code language: SQL (Structured Query Language) (sql)
Terceiro, use uma sintaxe de função de valor tabelado. Dessa forma, você usa o termo de pesquisa como o primeiro argumento da tabela:
SELECT *
FROM posts('fts5');
Code language: SQL (Structured Query Language) (sql)
Por padrão, o FTS5 é independente de maiúsculas e minúsculas. Ele trata os termos
fts5
FTS5
e Fts5
o mesmo. Para classificar os resultados da pesquisa do mais para o menos relevante, use a cláusula ORDER BY da seguinte maneira:
SELECT *
FROM posts
WHERE posts MATCH 'text'
ORDER BY rank;
Code language: SQL (Structured Query Language) (sql)
Usando sintaxe de consulta de texto completo
Uma consulta de pesquisa de texto completo é composta de frases, em que cada frase é uma lista ordenada de um ou mais tokens. Você pode usar o operador “+” para concatenar duas frases como no exemplo a seguir:
"learn SQLite"
"learn + SQLite"
Code language: SQL (Structured Query Language) (sql)
O FTS5 determina se um documento corresponde a uma frase se o documento contiver pelo menos uma subsequência de tokens que corresponda à sequência de tokens usada para construir a frase.
A consulta a seguir retorna todos os documentos que correspondem ao termo de pesquisa
Learn SQLite
:SELECT *
FROM posts
WHERE posts MATCH 'learn SQLite';
Code language: SQL (Structured Query Language) (sql)
Pesquisas de prefixo
Você pode usar o asterisco (*) como um token de prefixo. Quando uma frase contém o asterisco (*), ela corresponderá a qualquer documento que contenha o token que começa com a frase. Por exemplo, search* corresponde a search, search, searchs etc. Veja o exemplo a seguir:
SELECT *
FROM posts
WHERE posts = 'search*';
Code language: SQL (Structured Query Language) (sql)
Operadores booleanos
Você pode usar o operador booleano, por exemplo,
NOT
, OR
, ou AND
para combinar consultas. - q1 AND q2:corresponde se as consultas q1 e q2 corresponderem.
- q1 OR q2:corresponde se a consulta q1 ou q2 corresponder.
- q1 NOT q2:corresponde se a consulta q1 corresponder e a q2 não corresponder.
Por exemplo, para obter os documentos que correspondem ao
learn
frase, mas não corresponde ao FTS5
frase, você usa o NOT
operador da seguinte forma:SELECT *
FROM posts
WHERE posts MATCH 'learn NOT text';
Code language: SQL (Structured Query Language) (sql)
Para pesquisar documentos que correspondam a uma das frases
learn
ou text
, você usa o OR
operador conforme o exemplo a seguir:SELECT *
FROM posts
WHERE posts MATCH 'learn OR text';
Code language: SQL (Structured Query Language) (sql)
Para encontrar os documentos que correspondem ao SQLite e à pesquisa, você usa o
AND
operador como mostrado abaixo:SELECT *
FROM posts
WHERE posts MATCH 'sqlite AND searching';
Code language: SQL (Structured Query Language) (sql)
Para alterar a precedência do operador, use parênteses para agrupar expressões. Por exemplo:
SELECT *
FROM posts
WHERE posts MATCH 'search AND sqlite OR help';
Code language: SQL (Structured Query Language) (sql)
A instrução retorna documentos que correspondem a
search
e sqlite
ou help
. Para encontrar os documentos que correspondem a search
e sqlite
ou help
, você usa parênteses da seguinte forma:SELECT *
FROM posts
WHERE posts MATCH 'search AND (sqlite OR help)';
Code language: SQL (Structured Query Language) (sql)
Funções auxiliares incorporadas
O SQLite fornece três funções auxiliares integradas que podem ser usadas em consultas de texto completo na tabela FTS5.
- O
bm25()
retorna um valor que representa a precisão da correspondência atual, o valor mais baixo significa uma correspondência melhor. - O
highlight()
função auxiliar retorna uma cópia do texto com termos de pesquisa cercados por uma marcação especificada, por exemplo,termo de pesquisa - O
snippet()
seleciona um pequeno fragmento de texto para maximizar o número de termos de pesquisa que ele contém.
Por exemplo, a consulta a seguir usa a função highlight() para decorar os termos de pesquisa usando a 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)
Neste tutorial, você aprendeu como usar os recursos de pesquisa de texto completo do SQLite por meio do módulo de tabela virtual FTS5.