lakebase_tokenizer

Die Erweiterung lakebase_tokenizer fügt der PostgreSQL-Volltextsuche in Lakebase eine konfigurierbare Ganzwort-Tokenisierung hinzu. Textsuchkonfigurationen, die mit der Erweiterung gebaut wurden, arbeiten mit to_tsvector, dem @@ Operator, Rangfunktionen und GIN-Indexen. Du kannst auch generierte tsvector Werte für lakebase_text das BM25-Ranking verwenden.

Die Erweiterung stellt die tokenizer_wholeword Vorlage über die Standard-Textsuchwörterbuchoberfläche von PostgreSQL bereit. Die Vorlage unterstützt Kleinbuchstaben-Umwandlung, Unicode-Normalisierung, Akzententfernung, englische Possessiv-Entfernung, benutzerdefinierte Stoppwörter, Eins-zu-eins-Synonyme und englischen Stemming.

Installieren

Installiere die Erweiterung in deiner Datenbank. Die Beispiele auf dieser Seite verwenden ein dediziertes Schema, um die Erweiterungsobjekte leicht zu identifizieren:

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

Die Verlängerung ist verlegbar. Du kannst es bei der Installation durch ein anderes Schema ersetzen tokenizer_ext .

Erweiterung aktualisieren

Eine neue Lakebase Search-Version kann Funktionen, Korrekturen und Leistungsverbesserungen hinzufügen. PostgreSQL aktualisiert die installierte Erweiterungsversion nicht automatisch. Überprüfen Sie die installierten und aktuellsten verfügbaren Versionen:

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

Aktualisieren Sie die Erweiterung auf die aktuellste verfügbare Version:

ALTER EXTENSION lakebase_tokenizer UPDATE;

ALTER EXTENSION regeneriert keine gespeicherten tsvector Werte und stellt keine abhängigen GIN oder lakebase_bm25 Indizes wieder auf. Wenn ein Update die Tokenisierungsausgabe ändert, regeneriere wiederhergestellte Werte tsvector und folge den Release Notes für die erforderliche Indexpflege.

Schneller Start mit tokenizer_wholeword

Das folgende Beispiel erstellt ein Wörterbuch aus der Vorlage tokenizer_wholeword und mappt dann gängige PostgreSQL-Token-Typen in einer Textsuchkonfiguration darauf:

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;

Verwenden Sie die Konfiguration, um einen tsvector, erstellen Sie einen GIN-Index und führen Sie Volltextabfragen aus:

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é');

Verwenden Sie dieselbe Textsuchkonfiguration für Dokumente und Abfragen, sodass beide Seiten dieselbe Tokenisierungsstrategie und dieselbe Optionen anwenden.

Vorlage: tokenizer_wholeword

So funktioniert es

Für jedes Token, das vom Textsuchparser von PostgreSQL an das Wörterbuch übergeben wird, tokenizer_wholeword werden folgende Operationen angewendet:

  1. Lowercase: Konvertiere das Token in Kleinbuchstaben.
  2. Normalize: Anwenden Sie Unicode-Normalisierung.
  3. StripAccents: Entfernen Sie Akzente.
  4. EnglishPossessive: Entfernen Sie ein englisches possessives Suffix, wenn mindestens ein Zeichen übrig bleibt.
  5. Stopwords: Kein Lexem ausgeben und die Verarbeitung stoppen, wenn das Token mit einem konfigurierten Stoppwort übereinstimmt. Das Token wird aus dem erzeugten tsvectorToken weggelassen.
  6. Synonyms: Senden Sie den konfigurierten Ersatz aus und stoppen Sie die Verarbeitung, wenn das Token mit einem Synonym übereinstimmt.
  7. Stemmer: Wenn kein Synonym gematcht und Stemming aktiviert ist, wenden Sie den englischen stemmer an.

Fügen Sie Stoppwörter und Synonyme hinzu

Die Vorlage tokenizer_wholeword kann benutzerdefinierte Stopwörter und Synonyme aus von Erweiterungen verwalteten SQL-Tabellen lakebase_tokenizer_stopwords laden und lakebase_tokenizer_synonyms. Die Spalte name gruppiert die Zeilen zu einer Menge, die du mit der Option " Stopwords oder Synonyms " auswählen kannst.

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');

Beziehen Sie sich auf die Mengen, wenn Sie ein tokenizer_wholeword Wörterbuch erstellen oder verändern:

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

Die Erweiterung vergleicht Verschlusswörter und Quellwörter von Synonymen mit jedem Token nach Anwendung Lowercasevon , Normalize, StripAccents, und EnglishPossessive, jedoch vor der Anwendung Stemmer. Katalogeinträge werden nicht automatisch umgewandelt, daher werden sie in der exakt von den aktivierten Optionen erzeugten Form gespeichert:

  • Lowercase = 'true'Mit , verwenden Sie Kleinbuchstaben. Mit , muss die Lowercase = 'false'Großschreibung mit dem Token übereinstimmen.
  • Mit aktiviert speichern Sie Normalize Einträge im ausgewählten Unicode-Normalisierungsformular.
  • Mit , speichere StripAccents = 'true'die akzentgestreifte Form. Zum Beispiel speichern cafe , um zu übereinstimmen café.
  • Lagern Sie die Form vor dem Stimmen auf. Zum Beispiel entspricht runningmit Stemmer = 'english', ein run Eintrag nicht mit . Fügen Sie diesen Token zum Filter hinzu running oder ersetzen Sie es.

Set-Namen können bis zu 256 Bytes enthalten. Wörter und Synonyme können bis zu 1024 Bytes umfassen. Jedes benannte Stopwort oder Synonymset kann bis zu 100.000 Zeilen enthalten.

Ein Synonymersatz wird genau so emittiert, wie gespeichert, und wird vom Stemmer nicht verarbeitet. Synonyme unterstützen einen Ersatz für jedes Quellwort. Um einen Mehrwortersatz als ein Lexem darzustellen, verwendet man einen Separator wie einen Unterstrich, wie in united_states.

Nach der Änderung einer Menge muss der Besitzer jedes Wörterbuchs, das auf die Menge verweist, ein no-op ALTER TEXT SEARCH DICTIONARY ausführen, um ein Nachladen zu erzwingen:

ALTER TEXT SEARCH DICTIONARY documents_dict (dummy);

Die Option dummy existiert nicht auf tokenizer_wholeword. Das Weglassen eines Wertes bittet PostgreSQL, diese nicht vorhandene Option zu entfernen, was den Cache ungültig macht, ohne dass eine der konfigurierten Wörterbuchoptionen geändert wird.

Nach dem Neuladen des Wörterbuchs generieren Sie die gespeicherten tsvector Werte, indem Sie die Quellzeilen neu schreiben:

UPDATE documents SET body = body;

Rollen und Zugang

Verwenden Sie zwei Rollen, um den Anwendungszugriff von der Tokenizer-Verwaltung zu trennen:

  • app_role verwendet bestehende Wörterbücher. Es muss USAGE die relevanten Schemata und SELECT die Erweiterungskatalogtabellen enthalten, aber es muss nicht die Wörterbücher besitzen.
  • tokenizer_admin verwaltet Stop-Word- und Synonym-Sets, erstellt und besitzt Wörterbücher und Textsuchkonfigurationen und führt nach Änderung einer Menge den Reload-Befehl aus.

Gewähren Sie Zugriff auf das Erweiterungsschema und die Katalogtabellen:

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 auch benötigt CREATE das Schema, in dem Wörterbücher und Textsuchkonfigurationen gespeichert sind. Erstelle diese Objekte als tokenizer_admin, oder übertrage ihr Eigentum daran. Schreibzugriff auf die Katalogtabellen gewährt keinen Eigentum an bestehenden Wörterbüchern.

Options

Spezifizieren Sie tokenizer_wholeword Optionen in CREATE TEXT SEARCH DICTIONARY oder ALTER TEXT SEARCH DICTIONARY. Die Optionsnamen sind nicht groß- und kleinschreibungsabhängig.

Auswahl Typ Vorgabe Description
Lowercase boolean true Wandelt Token in Kleinbuchstaben um, bevor weitere Operationen angewendet werden. Stemmer = 'english' erfordert Lowercase = 'true'.
Normalize NFC, NFD, NFKC, NFKD oder none none Verwendet das ausgewählte Unicode-Normalisierungsformular. Dies kanonisiert die Darstellung, entfernt jedoch keine Charaktere. Zum Beispiel NFC macht präkomponiert é und e gefolgt von einem kombinierten akuten Akzentäquivalent.
EnglishPossessive boolean true Entfernt ein nachlaufendes 's, ’s, oder 's wenn mindestens ein Zeichen vor dem Suffix steht. Ein eigenständiges Suffix bleibt unverändert.
StripAccents boolean false Wendet NFKD-Normalisierung an und entfernt kombinierte Markierungen. café wird beispielsweise zu cafe. Wenn diese Option aktiviert ist, lassen Sie weg, Normalize da der NFKD-Schritt jede separate Unicode-Normalisierung überflüssig macht.
Stopwords Setname Nichts Verwendet die benannte Menge aus tokenizer_ext.lakebase_tokenizer_stopwords.
Synonyms Setname Nichts Verwendet die benannte Menge von Eins-zu-eins-Ersetzungen aus tokenizer_ext.lakebase_tokenizer_synonyms.
Stemmer english Nichts Verwendet den mitgelieferten englischen Stemmer Snowball 3.1.0. Verzichte auf diese Option, um das Stimmen zu deaktivieren. Der Stemmer enthält keine Stop-Word-Liste.

Katalogtabellen

Tabelle Columns Description
lakebase_tokenizer_stopwords name text, word text Stores mit Namen Stop-Word-Sets für Tokenizer-Vorlagen, die . Stopwordsunterstützen. Der Primärschlüssel ist (name, word).
lakebase_tokenizer_synonyms name text, word text, synonym text Stores benannten Eins-zu-eins-Ersatz für Tokenizer-Vorlagen, die .Synonyms Der Primärschlüssel ist (name, word).

Nutze das BM25-Ranking mit lakebase_text

Textsuchkonfigurationen, die mit lakebase_tokenizer erstellt wurden, erzeugen Standard-PostgreSQL-Werte tsvector , die mit kompatibel lakebase_textsind. Um die Relevanzrangordnung von BM25 und die Top-K-Abfrage zu verwenden, erstellen Sie einen Index lakebase_bm25 in derselben tsvector Spalte. Für Installation, Indexerstellung und Abfragesyntax siehe lakebase_text.

Nächste Schritte