lakebase_tokenizer

Tillägget lakebase_tokenizer lägger till konfigurerbar helordstokenisering till PostgreSQL:s fulltextsökning i Lakebase. Textsökningskonfigurationer som byggts med tillägget arbetar med to_tsvector, operatorn @@ , rangordningsfunktionerna och GIN-indexen. Du kan också använda genererade tsvector värden för lakebase_text BM25-ranking.

Tillägget tillhandahåller mallen tokenizer_wholeword via PostgreSQL:s standardgränssnitt för textsökning. Mallen stödjer konvertering av gemener med gemener, Unicode-normalisering, accentborttagning, borttagning av engelsk possessiv, anpassade stoppord, en-till-en-synonymer och engelsk stemming.

Install

Installera tillägget i din databas. Exemplen på denna sida använder ett dedikerat schema för att göra tilläggsobjekten lätta att identifiera:

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

Förlängningen är flyttbar. Du kan byta ut tokenizer_ext det mot ett annat schema när du installerar det.

Uppgradera tillägget

En ny Lakebase Search-version kan lägga till funktioner, fixar och prestandaförbättringar. PostgreSQL uppdaterar inte automatiskt den installerade tilläggsversionen. Kontrollera de installerade och senaste tillgängliga versionerna:

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

Uppdatera tillägget till den senaste tillgängliga versionen:

ALTER EXTENSION lakebase_tokenizer UPDATE;

ALTER EXTENSION regenererar inte återställda tsvector värden eller bygger om beroende GIN eller lakebase_bm25 index. Om en uppdatering ändrar tokeniseringsutdata, regenerera återställda tsvector värden och följ versionsanteckningarna för eventuellt nödvändigt indexunderhåll.

Snabb start med tokenizer_wholeword

Följande exempel skapar en ordbok från mallen tokenizer_wholeword och mappar sedan vanliga PostgreSQL-tokentyper till den i en textsökningskonfiguration:

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;

Använd konfigurationen för att skapa ett tsvector, skapa ett GIN-index och kör fulltextfrågor:

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

Använd samma textsökningskonfiguration för dokument och frågor så att båda sidor tillämpar samma tokeniseringsstrategi och alternativ.

Mall: tokenizer_wholeword

Så här fungerar det

För varje token som skickas till ordboken av PostgreSQL:s textsökparser tokenizer_wholeword tillämpas dessa operationer:

  1. Lowercase: Konvertera token till gemener bokstäver.
  2. Normalize: Tillämpa Unicode-normalisering.
  3. StripAccents: Ta bort accenter.
  4. EnglishPossessive: Ta bort ett engelskt possessivsuffix när minst ett tecken återstår.
  5. Stopwords: Sänd ingen lexem och stoppa bearbetningen om token matchar ett konfigurerat stoppord. Tokenen utelämnas från den genererade tsvector.
  6. Synonyms: Släpp ut den konfigurerade ersättningen och stoppa bearbetningen om token matchar en synonym.
  7. Stemmer: Om ingen synonym matchad och stamming är aktiverad, använd den engelska stemmer.

Lägg till stoppord och synonymer

Mallen tokenizer_wholeword kan ladda anpassade stoppord och synonymer från tilläggshanterade SQL-tabeller lakebase_tokenizer_stopwords och lakebase_tokenizer_synonyms. Kolumnen name grupperar rader i en mängd som du väljer med Stopwords ordboksalternativet eller Synonyms .

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

Referera till mängderna när du skapar eller ändrar en tokenizer_wholeword ordbok:

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

Tillägget jämför stoppord och synonyma källord med varje token efter att ha applicerat Lowercase, Normalize, StripAccents, och EnglishPossessive, men innan man applicerar Stemmer. Katalogposter transformeras inte automatiskt, så lagra dem i exakt den form som produceras av de aktiverade alternativen:

  • Med Lowercase = 'true', använd gemener i posten. Med Lowercase = 'false', måste kapitaliseringen matcha tokenen.
  • Med Normalize aktiverat, lagra poster i det valda Unicode-normaliseringsformuläret.
  • Med StripAccents = 'true', lagra den accentrandade formen. Till exempel, lagra cafe för att matcha café.
  • Förvara formuläret innan du stämmer. Till exempel, med Stemmer = 'english', matchar runningen run post inte . Lägg till running för att filtrera eller ersätta den token.

Setnamn kan innehålla upp till 256 byte. Ord och synonymer kan innehålla upp till 1024 byte. Varje namngivet stoppord eller synonymuppsättning kan innehålla upp till 100 000 rader.

En synonymersättning emitteras exakt som den lagrats och bearbetas inte av stemmern. Synonymer stödjer en ersättning för varje källord. För att representera en flerordsersättning som ett lexem, använd en separator såsom ett understreck, som i united_states.

Efter att ha ändrat en mängd måste ägaren till varje ordbok som refererar till mängden köra en no-op ALTER TEXT SEARCH DICTIONARY för att tvinga fram en omladdning:

ALTER TEXT SEARCH DICTIONARY documents_dict (dummy);

Alternativet dummy finns inte på tokenizer_wholeword. Att utelämna ett värde ber PostgreSQL att ta bort detta icke-existerande alternativ, vilket ogiltigförklarar cachen utan att ändra något av ordboksens konfigurerade alternativ.

Efter att ha laddat om ordboken, återgenerera de lagrade tsvector värdena genom att skriva om källraderna:

UPDATE documents SET body = body;

Roller och tillgång

Använd två roller för att separera applikationsåtkomst från tokenizeradministration:

  • app_role använder befintliga ordböcker. Den behöver USAGE på relevanta scheman och SELECT på tilläggskatalogtabellerna, men den behöver inte äga ordböckerna.
  • tokenizer_admin hanterar stop-word- och synonymmängder, skapar och äger ordböcker och textsökningskonfigurationer, och kör omladdningskommandot efter att en uppsättning ändrats.

Ge tillgång till tilläggsschemat och katalogtabellerna:

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 även behov CREATE på schemat där ordböcker och textsökningskonfigurationer lagras. Skapa dessa objekt som tokenizer_admin, eller överför deras äganderätt till dem. Skrivåtkomst till katalogtabellerna ger inte äganderätt till befintliga ordböcker.

Options

Specificera tokenizer_wholeword alternativ i CREATE TEXT SEARCH DICTIONARY eller ALTER TEXT SEARCH DICTIONARY. Alternativnamn är inte kasuskänsliga.

Option Type Standardinställning Description
Lowercase boolean true Konverterar tokens till gemener innan andra operationer tillämpas. Stemmer = 'english' kräver Lowercase = 'true'.
Normalize NFC, NFD, NFKC, NFKDeller none none Applicerar det valda Unicode-normaliseringsformuläret. Detta kanonikaliserar representationen men tar inte bort karaktärerna. Till exempel NFC gör förkomponerad é och e följt av en kombinerande akut accentekvivalent.
EnglishPossessive boolean true Tar bort en efterföljande 's, ’s, eller 's när minst ett tecken föregår suffixet. Ett fristående suffix förblir oförändrat.
StripAccents boolean false Applicerar NFKD-normalisering och tar bort kombinerande markeringar. Till exempel kommer café att bli cafe. När detta alternativ är aktiverat, utelämna Normalize eftersom NFKD-steget gör all separat Unicode-normalisering överflödig.
Stopwords Setets namn None Använder den namngivna mängden från tokenizer_ext.lakebase_tokenizer_stopwords.
Synonyms Setets namn None Använder den namngivna uppsättningen av en-till-en-ersättningar från tokenizer_ext.lakebase_tokenizer_synonyms.
Stemmer english None Använder den medföljande Snowball 3.1.0 English stemmer. Utelämna detta alternativ för att inaktivera stemming. Stemmern innehåller ingen stoppordslista.

Katalogtabeller

Tabell Columns Description
lakebase_tokenizer_stopwords name text, word text Butiker med namn stop-word-set för tokenizer-mallar som stödjer Stopwords. Den primära nyckeln är (name, word).
lakebase_tokenizer_synonyms name text, word text, synonym text Butiker har namngivet en-till-en-ersättningar för tokenizer-mallar som stödjer Synonyms. Den primära nyckeln är (name, word).

Använd BM25-rankingen med lakebase_text

Textsökningskonfigurationer byggda med lakebase_tokenizer producerar standardvärden för PostgreSQL tsvector som är kompatibla med lakebase_text. För att använda BM25:s relevansrangordning och top-K-hämtning, skapa ett lakebase_bm25 index i samma tsvector kolumn. För installation, indexskapande och frågesyntax, se lakebase_text.

Nästa steg