SQLite
 sql >> Base de données >  >> RDS >> SQLite

Premiers pas avec la recherche en texte intégral SQLite

Résumé  :dans ce didacticiel, vous apprendrez à utiliser la fonctionnalité de recherche en texte intégral SQLite en utilisant le module de table virtuelle FTS5.

Introduction à la recherche en texte intégral SQLite

Une table virtuelle est une extension personnalisée de SQLite. Une table virtuelle est comme une table normale. La différence entre une table virtuelle et une table normale est la provenance des données, c'est-à-dire que lorsque vous traitez une table normale, SQLite accède au fichier de base de données pour récupérer les données. Cependant, lorsque vous accédez à une table virtuelle, SQLite appelle le code personnalisé pour obtenir les données. Le code personnalisé peut avoir une logique spécifiée pour gérer certaines tâches telles que l'obtention de données à partir de plusieurs sources de données.

Pour utiliser la recherche en texte intégral dans SQLite, vous utilisez le module de table virtuelle FTS5.

Le suivant CREATE VIRTUAL TABLE crée une table FTS5 avec deux colonnes :

CREATE VIRTUAL TABLE table_name 
USING FTS5(column1,column2...);
Code language: SQL (Structured Query Language) (sql)

Notez que vous ne pouvez pas ajouter de types, de contraintes ou de PRIMARY KEY déclaration dans la CREATE VIRTUAL TABLE déclaration pour créer une table FTS5. Si vous le faites, SQLite émettra une erreur.

Comme pour créer une table normale sans spécifier la colonne de clé primaire, SQLite ajoute un rowid implicite colonne à la table FTS5.

L'exemple suivant crée une table FTS5 nommée posts avec deux colonnes title et body .

CREATE VIRTUAL TABLE posts 
USING FTS5(title, body);
Code language: SQL (Structured Query Language) (sql)

Semblable à un tableau normal, vous pouvez insérer des données dans les posts tableau comme suit :

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)

Et interrogez les données correspondantes :

SELECT * FROM posts;
Code language: SQL (Structured Query Language) (sql)

Interroger des données à l'aide de la recherche en texte intégral

Vous pouvez exécuter une requête en texte intégral sur une table FTS5 en utilisant l'une de ces trois méthodes.

Tout d'abord, utilisez un MATCH opérateur dans la clause WHERE de l'instruction SELECT. Par exemple, pour obtenir toutes les lignes contenant le terme fts5 , vous utilisez la requête suivante :

SELECT * 
FROM posts 
WHERE posts MATCH 'fts5';
Code language: SQL (Structured Query Language) (sql)

Deuxièmement, utilisez un égal (= ) opérateur dans le WHERE clause du SELECT déclaration. L'instruction suivante renvoie le même résultat que l'instruction ci-dessus :

SELECT * 
FROM posts 
WHERE posts = 'fts5';
Code language: SQL (Structured Query Language) (sql)

Troisièmement, utilisez une syntaxe de fonction de valeur tabulée. De cette manière, vous utilisez le terme de recherche comme premier argument du tableau :

SELECT * 
FROM posts('fts5');
Code language: SQL (Structured Query Language) (sql)

Par défaut, FTS5 est indépendant de la casse. Il traite les termes fts5 FTS5 et Fts5 le même.

Pour trier les résultats de la recherche du plus pertinent au moins pertinent, utilisez la clause ORDER BY comme suit :

SELECT * 
FROM posts 
WHERE posts MATCH 'text' 
ORDER BY rank;
Code language: SQL (Structured Query Language) (sql)

Utilisation de la syntaxe de requête en texte intégral

Une requête de recherche en texte intégral est composée d'expressions, chaque expression étant une liste ordonnée d'un ou plusieurs jetons. Vous pouvez utiliser l'opérateur "+" pour concaténer deux phrases comme dans l'exemple suivant :

"learn SQLite"
"learn + SQLite"
Code language: SQL (Structured Query Language) (sql)

FTS5 détermine si un document correspond à une phrase si le document contient au moins une sous-séquence de jetons qui correspondent à la séquence de jetons utilisée pour construire la phrase.

La requête suivante renvoie tous les documents correspondant au terme de recherche Learn SQLite :

SELECT * 
FROM posts 
WHERE posts MATCH 'learn SQLite';
Code language: SQL (Structured Query Language) (sql)

Recherches de préfixe

Vous pouvez utiliser l'astérisque (*) comme jeton de préfixe. Lorsqu'une phrase contient l'astérisque (*), elle correspondra à tout document contenant le jeton commençant par la phrase. Par exemple, recherche* correspond à recherche, recherche, recherches, etc. Voir l'exemple suivant :

SELECT * 
FROM posts
WHERE posts = 'search*';Code language: SQL (Structured Query Language) (sql)

Opérateurs booléens

Vous pouvez utiliser l'opérateur booléen, par exemple NOT , OR , ou AND pour combiner des requêtes.

  • q1 AND q2 :correspond si les requêtes q1 et q2 correspondent.
  • q1 OR q2 :correspond si la requête q1 ou q2 correspond.
  • q1 NOT q2 :correspond si la requête q1 correspond et que q2 ne correspond pas.

Par exemple, pour obtenir les documents qui correspondent au learn phrase mais ne correspond pas au FTS5 phrase, vous utilisez le NOT opérateur comme suit :

SELECT * 
FROM posts 
WHERE posts MATCH 'learn NOT text';
Code language: SQL (Structured Query Language) (sql)

Pour rechercher des documents correspondant à l'une ou l'autre des phrases learn ou text , vous utilisez le OR opérateur comme l'exemple suivant :

SELECT * 
FROM posts 
WHERE posts MATCH 'learn OR text';
Code language: SQL (Structured Query Language) (sql)

Pour trouver les documents qui correspondent à la fois à SQLite et à la recherche, vous utilisez le AND opérateur comme indiqué ci-dessous :

SELECT * 
FROM posts 
WHERE posts MATCH 'sqlite AND searching';
Code language: SQL (Structured Query Language) (sql)

Pour modifier la priorité des opérateurs, vous utilisez des parenthèses pour regrouper les expressions. Par exemple :

SELECT * 
FROM posts 
WHERE posts MATCH 'search AND sqlite OR help';
Code language: SQL (Structured Query Language) (sql)

L'instruction renvoie les documents qui correspondent à search et sqlite ou help . Pour trouver les documents qui correspondent à search et soit sqlite ou help , vous utilisez les parenthèses comme suit :

SELECT * 
FROM posts 
WHERE posts MATCH 'search AND (sqlite OR help)';
Code language: SQL (Structured Query Language) (sql)

Fonctions auxiliaires intégrées

SQLite fournit trois fonctions auxiliaires intégrées qui peuvent être utilisées dans des requêtes en texte intégral sur la table FTS5.

  • Le bm25() renvoie une valeur qui représente la précision de la correspondance actuelle, la valeur inférieure signifie une meilleure correspondance.
  • Le highlight() la fonction auxiliaire renvoie une copie du texte avec les termes de recherche entourés d'un balisage spécifié, par exemple,terme de recherche
  • Le snippet() sélectionne un court fragment de texte afin de maximiser le nombre de termes de recherche qu'il contient.

Par exemple, la requête suivante utilise la fonction highlight() pour décorer les termes de recherche à l'aide de la balise :

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)

Dans ce didacticiel, vous avez appris à utiliser les fonctionnalités de recherche en texte intégral de SQLite via le module de table virtuelle FTS5.