Aller au contenu principal

lakebase_tokenizer

L'extension lakebase_tokenizer ajoute la tokenisation configurable de mots entiers à la recherche en texte intégral PostgreSQL dans Lakebase. Les configurations de recherche textuelle créées avec l'extension fonctionnent avec to_tsvector, l'opérateur @@, les fonctions de classement et les index GIN. Vous pouvez également utiliser des valeurs tsvector générées avec lakebase_text pour le classement BM25.

L'extension fournit le template tokenizer_wholeword via l'interface standard de dictionnaire de recherche textuelle de PostgreSQL. Le template prend en charge la conversion en minuscules, la normalisation Unicode, la suppression des accents, la suppression du génitif anglais, les mots vides personnalisés, les synonymes univoques et la racinisation en anglais.

Installer​

Installez l'extension dans votre base de données. Les exemples de cette page utilisent un schéma dédié pour permettre d'identifier facilement les objets d'extension :

SQL
CREATE SCHEMA IF NOT EXISTS tokenizer_ext;
CREATE EXTENSION IF NOT EXISTS lakebase_tokenizer WITH SCHEMA tokenizer_ext;

L’extension est déplaçable. Vous pouvez remplacer tokenizer_ext par un autre schéma lorsque vous l’installez.

Mettre à jour l’extension​

Une nouvelle version de Lakebase Search peut apporter de nouvelles fonctionnalités, des correctifs et des améliorations des performances. PostgreSQL ne met pas automatiquement à jour la version de l'extension installée. Vérifiez les versions installées et la dernière version disponible :

SQL
SELECT installed_version, default_version
FROM pg_available_extensions
WHERE name = 'lakebase_tokenizer';

Mettez à jour l’extension vers la dernière version disponible :

SQL
ALTER EXTENSION lakebase_tokenizer UPDATE;

ALTER EXTENSION ne régénère pas les valeurs tsvector stockées et ne reconstruit pas les index GIN ou lakebase_bm25 dépendants. Si une mise à jour modifie le résultat de la tokenisation, régénérez les valeurs tsvector stockées et suivez les notes de version pour toute maintenance d'index requise.

Quick start with tokenizer_wholeword​

L’exemple suivant crée un dictionnaire à partir du template tokenizer_wholeword, puis y associe des types de token PostgreSQL courants dans une configuration de recherche textuelle :

SQL
CREATE TEXT SEARCH DICTIONARY documents_dict (
TEMPLATE = tokenizer_ext.tokenizer_wholeword,
Lowercase = 'true',
StripAccents = 'true',
Stemmer = 'english'
);

CREATE TEXT SEARCH CONFIGURATION documents_cfg (COPY = pg_catalog.simple);

ALTER TEXT SEARCH CONFIGURATION documents_cfg
ALTER MAPPING FOR asciiword, word, numword, hword_numpart, hword_part, hword_asciipart
WITH documents_dict;

Utilisez la configuration pour produire un tsvector, créez un index GIN et exécutez des requêtes en texte intégral :

SQL
CREATE TABLE documents (
id BIGSERIAL PRIMARY KEY,
body TEXT NOT NULL,
search_vector TSVECTOR GENERATED ALWAYS AS (
to_tsvector('documents_cfg', body)
) STORED
);

INSERT INTO documents (body) VALUES
('Cats are running near the café.'),
('A dog is sleeping in the house.');

CREATE INDEX documents_search_idx ON documents USING gin (search_vector);

SELECT id, body
FROM documents
WHERE search_vector @@ plainto_tsquery('documents_cfg', 'running café');

Utilisez la même configuration de recherche de texte pour les documents et les requêtes afin que les deux côtés appliquent la même stratégie de tokenisation et les mêmes options.

Template: tokenizer_wholeword​

Comment ça marche​

For each token passed to the dictionary by PostgreSQL's text-search parser, tokenizer_wholeword applies these Opérations:

  1. Lowercase: convertir le jeton en minuscules.
  2. Normalize: appliquez la normalisation Unicode.
  3. StripAccents: Supprimer les accents.
  4. EnglishPossessive: supprimer un suffixe possessif anglais lorsqu'il reste au moins un caractère.
  5. Stopwords: N'émettez aucun lexème et arrêtez le traitement si le token correspond à un mot vide configuré. Le jeton est omis du tsvector généré.
  6. Synonyms: émettre le remplacement configuré et arrêter le traitement si le token correspond à un synonyme.
  7. Stemmer: Si aucun synonyme ne correspond et que la recherche par radical est activée, appliquez le radicalisateur anglais.

Ajouter des mots vides et des synonymes​

Le template tokenizer_wholeword peut charger des mots vides et des synonymes personnalisés à partir des tables SQL lakebase_tokenizer_stopwords et lakebase_tokenizer_synonyms gérées par l’extension. La colonne name regroupe les lignes en un ensemble que vous sélectionnez avec l’option de dictionnaire Stopwords ou Synonyms.

SQL
INSERT INTO tokenizer_ext.lakebase_tokenizer_stopwords (name, word) VALUES
('app_stopwords', 'the'),
('app_stopwords', 'and'),
('app_stopwords', 'or');

INSERT INTO tokenizer_ext.lakebase_tokenizer_synonyms (name, word, synonym) VALUES
('app_synonyms', 'usa', 'united_states'),
('app_synonyms', 'uk', 'united_kingdom');

Référencez les ensembles lorsque vous créez ou modifiez un dictionnaire tokenizer_wholeword :

SQL
ALTER TEXT SEARCH DICTIONARY documents_dict (
Stopwords = 'app_stopwords',
Synonyms = 'app_synonyms'
);

L'extension compare les mots vides et les mots sources de synonymes avec chaque jeton après avoir appliqué Lowercase, Normalize, StripAccents et EnglishPossessive, mais avant d'appliquer Stemmer. Les entrées de catalogue ne sont pas transformées automatiquement ; stockez-les donc sous la forme exacte produite par ces options activées :

  • With Lowercase = 'true', use lowercase entries. With Lowercase = 'false', capitalization must match the token.
  • Avec Normalize activé, stockez les entrées dans la forme de normalisation Unicode sélectionnée.
  • Avec StripAccents = 'true', stockez la forme sans accents. Par exemple, stockez cafe pour correspondre à café.
  • Stockez la forme avant la stemming. Par exemple, avec Stemmer = 'english', une entrée run ne correspond pas à running. Ajoutez running pour filtrer ou remplacer ce jeton.

Les ensembles de noms peuvent contenir jusqu'à 256 octets. Les mots et les synonymes peuvent contenir jusqu'à 1 024 octets. Chaque ensemble de mots vides ou de synonymes nommé peut contenir jusqu'à 100 000 lignes.

Un remplacement de synonyme est émis exactement tel qu'il est stocké et n'est pas traité par le racineur (« stemmer »). Les synonymes prennent en charge un seul remplacement pour chaque mot source. Pour représenter un remplacement de plusieurs mots sous la forme d'un seul lexème, utilisez un séparateur tel qu'un trait de soulignement, comme dans united_states.

Après avoir modifié un ensemble, le propriétaire de chaque dictionnaire qui fait référence à l'ensemble doit exécuter un ALTER TEXT SEARCH DICTIONARY vide pour forcer un rechargement :

SQL
ALTER TEXT SEARCH DICTIONARY documents_dict (dummy);

L'option dummy n'existe pas sur tokenizer_wholeword. Omettre une valeur demande à PostgreSQL de supprimer cette option inexistante, ce qui invalide le cache sans modifier aucune des options configurées du dictionnaire.

Après le rechargement du dictionnaire, régénérez les valeurs tsvector stockées en réécrivant les lignes source :

SQL
UPDATE documents SET body = body;

Rôles et accès​

Utiliser deux rôles pour séparer l'accès des applications de l'administration du tokenizer :

  • app_role utilise les dictionnaires existants. Il lui faut USAGE sur les schémas pertinents et SELECT sur les tables du catalogue d'extension, mais il n'a pas besoin d'être propriétaire des dictionnaires.
  • tokenizer_admin gère les ensembles de mots vides et de synonymes, crée et possède les dictionnaires et les configurations de recherche textuelle, et exécute la commande de rechargement après la modification d'un ensemble.

Accordez l'accès au schéma d'extension et aux tables du catalogue :

SQL
GRANT USAGE ON SCHEMA tokenizer_ext TO app_role, tokenizer_admin;

GRANT SELECT ON
tokenizer_ext.lakebase_tokenizer_stopwords,
tokenizer_ext.lakebase_tokenizer_synonyms
TO app_role;

GRANT SELECT, INSERT, UPDATE, DELETE ON
tokenizer_ext.lakebase_tokenizer_stopwords,
tokenizer_ext.lakebase_tokenizer_synonyms
TO tokenizer_admin;

tokenizer_admin nécessite également CREATE sur le schéma où les dictionnaires et les configurations de recherche textuelle sont stockés. Créez ces objets en tant que tokenizer_admin ou transférez-leur la propriété. L'accès en écriture aux tables du catalogue ne confère pas la propriété des dictionnaires existants.

Options​

Spécifiez les options tokenizer_wholeword dans CREATE TEXT SEARCH DICTIONARY ou ALTER TEXT SEARCH DICTIONARY. Les noms d'option ne sont pas sensibles à la casse.

Option

Type

Par défaut

Description

Lowercase

booléen

true

Convertit les tokens en minuscules avant d'appliquer d'autres Opérations. Stemmer = 'english' nécessite Lowercase = 'true'.

Normalize

NFC, NFD, NFKC, NFKD ou none

none

Applique la forme de normalisation Unicode sélectionnée. Cette opération normalise la représentation, mais ne supprime pas les caractères. Par exemple, NFC permet d’obtenir une forme précomposée de é et de e suivie d’un équivalent d’accent aigu combinant.

EnglishPossessive

booléen

true

Supprime un suffixe final 's, ’s ou 's lorsqu’au moins un caractère précède le suffixe. Un suffixe autonome reste inchangé.

StripAccents

booléen

false

S'applique à la normalisation NFKD et supprime les caractères diacritiques combinants. Par exemple, café devient cafe. Lorsque cette option est activée, omettez Normalize car l'étape NFKD rend toute normalisation Unicode distincte redondante.

Stopwords

définir le nom

Aucun

Utilise l'ensemble nommé de tokenizer_ext.lakebase_tokenizer_stopwords.

Synonyms

définir le nom

Aucun

Utilise l’ensemble nommé de remplacements biunivoques de tokenizer_ext.lakebase_tokenizer_synonyms.

Stemmer

english

Aucun

Utilise le bundle Snowball 3.1.0 Racineur anglais. Omettez cette option pour désactiver la racinisation. Le racineur n’inclut pas de liste de mots vides.

Option

Type

Par défaut

Description

Lowercase

booléen

true

Convertit les tokens en minuscules avant d'appliquer d'autres Opérations. Stemmer = 'english' nécessite Lowercase = 'true'.

Normalize

NFC, NFD, NFKC, NFKD ou none

none

Applique la forme de normalisation Unicode sélectionnée. Cette opération normalise la représentation, mais ne supprime pas les caractères. Par exemple, NFC permet d’obtenir une forme précomposée de é et de e suivie d’un équivalent d’accent aigu combinant.

EnglishPossessive

booléen

true

Supprime un suffixe final 's, ’s ou 's lorsqu’au moins un caractère précède le suffixe. Un suffixe autonome reste inchangé.

StripAccents

booléen

false

S'applique à la normalisation NFKD et supprime les caractères diacritiques combinants. Par exemple, café devient cafe. Lorsque cette option est activée, omettez Normalize car l'étape NFKD rend toute normalisation Unicode distincte redondante.

Stopwords

définir le nom

Aucun

Utilise l'ensemble nommé de tokenizer_ext.lakebase_tokenizer_stopwords.

Synonyms

définir le nom

Aucun

Utilise l’ensemble nommé de remplacements biunivoques de tokenizer_ext.lakebase_tokenizer_synonyms.

Stemmer

english

Aucun

Utilise le bundle Snowball 3.1.0 Racineur anglais. Omettez cette option pour désactiver la racinisation. Le racineur n’inclut pas de liste de mots vides.

Tables de catalogue​

Table

Colonnes

Description

lakebase_tokenizer_stopwords

name text, word text

Stocke des ensembles de mots vides nommés pour les Template de tokenizer qui prennent en charge Stopwords. La clé primaire est (name, word).

lakebase_tokenizer_synonyms

name text, word text, synonym text

Stocke les remplacements un à un pour les Template de tokenizer qui prennent en charge Synonyms. La clé primaire est (name, word).

Table

Colonnes

Description

lakebase_tokenizer_stopwords

name text, word text

Stocke des ensembles de mots vides nommés pour les Template de tokenizer qui prennent en charge Stopwords. La clé primaire est (name, word).

lakebase_tokenizer_synonyms

name text, word text, synonym text

Stocke les remplacements un à un pour les Template de tokenizer qui prennent en charge Synonyms. La clé primaire est (name, word).

Utiliser le classement BM25 avec lakebase_text​

Les configurations de recherche textuelle créées avec lakebase_tokenizer produisent des valeurs PostgreSQL tsvector standard compatibles avec lakebase_text. Pour utiliser le classement par pertinence BM25 et la récupération top-K, créez un index lakebase_bm25 sur la même colonne tsvector. Pour en savoir plus sur l'installation, la création d'index et la syntaxe de requête, consultez lakebase_text.

Étapes suivantes​