lakebase_tokenizer

該 lakebase_tokenizer 擴充功能為 Lakebase 的 PostgreSQL 全文搜尋新增了可配置的整字標記功能。 使用擴充套件建立的文字搜尋配置可搭配 to_tsvector運算子、 @@ 排名函數及 GIN 索引。 你也可以用生成tsvectorlakebase_text的數值來做 BM25 排名。

擴充功能透過 PostgreSQL 標準的文字搜尋字典介面提供範本 tokenizer_wholeword 。 該範本支援小寫轉換、Unicode 正規化、重音去除、英語所有格去除、自訂停字、一對一同義詞及英語詞幹處理。

Install

把擴充功能安裝到你的資料庫裡。 本頁範例使用專用結構,使擴充物件易於辨識:

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

該延伸線可重新定位。 安裝時可以換 tokenizer_ext 成其他架構。

升級擴充功能

新的 Lakebase Search 版本可以新增功能、修正與效能提升。 PostgreSQL 不會自動更新已安裝的擴充套件版本。 請檢查已安裝及最新可用版本:

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

將擴充功能更新到最新可用版本:

ALTER EXTENSION lakebase_tokenizer UPDATE;

ALTER EXTENSION 不會重新產生儲存 tsvector 值或重建依賴的 GIN 或 lakebase_bm25 索引。 若更新改變標記化輸出,請重新產生儲存 tsvector 值,並依照發布說明進行必要的索引維護。

快速入門 tokenizer_wholeword

以下範例將從 tokenizer_wholeword 範本建立字典,然後以文字搜尋配置將常見的 PostgreSQL 標記類型對應至該範本:

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;

使用該設定產生 tsvector,建立 GIN 索引,並執行全文查詢:

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

文件與查詢使用相同的文字搜尋配置,讓雙方採用相同的標記化策略與選項。

範本:tokenizer_wholeword

運作原理

對於 PostgreSQL 的文字搜尋解析器傳遞給字典的每個符號,會 tokenizer_wholeword 執行以下操作:

  1. Lowercase:將代幣轉換為小寫。
  2. Normalize: 應用 Unicode 正規化。
  3. StripAccents:去除重音。
  4. EnglishPossessive: 當至少有一個字元剩餘時,請移除英語所有格後綴。
  5. Stopwords: 若令牌與已設定的停止字相符,則不輸出詞素並停止處理。 產生 tsvector的 中,該標記被省略。
  6. Synonyms: 發出已設定的替換,若令牌與同義詞相符,則停止處理。
  7. Stemmer: 若未匹配同義詞且啟用詞幹,則應用英文詞幹詞。

加入停頓詞和同義詞

範本 tokenizer_wholeword 可從擴充管理的 lakebase_tokenizer_stopwordslakebase_tokenizer_synonymsSQL 資料表載入自訂的停止字與同義詞。 欄位 name 會將資料列分組成一個集合,你可以用 Stopwords or 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');

在建立或修改 tokenizer_wholeword 字典時,請參考這些詞典:

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

擴充功能在應用 Lowercase、 Normalize、 StripAccents和 EnglishPossessive,但應用 Stemmer之前,將停止字與同義詞與每個詞彙進行比較。 目錄條目不會自動轉換,因此請以這些啟用選項所產生的精確格式儲存:

  • 其中 Lowercase = 'true',使用小寫詞條。 當 Lowercase = 'false',大小寫必須與該代幣相符。
  • 啟用後 Normalize ,會將條目儲存在所選的 Unicode 正規化形式中。
  • 其中 StripAccents = 'true',儲存去除重音的表單。 例如,儲存 cafe 為匹配 café。
  • 在做主腳前先把表單保存好。 例如,當 , Stemmer = 'english'一個 run 元素不匹配 running。 新增 running 以過濾或替換該標記。

集合名稱最多可包含 256 位元組。 單字與同義詞最多可包含 1024 位元組。 每個命名的停止字或同義詞集合最多可包含 100,000 列。

同義詞替換是完全按照儲存的狀態輸出,且不被幹性處理。 同義詞支持每個來源詞的一個替換詞。 要將多詞置換表示為一個詞素,請使用分隔符,例如底線,如 united_states。

更改一個集合後,每個引用該集合的字典擁有者必須執行一個 no-op ALTER TEXT SEARCH DICTIONARY 強制重新載入:

ALTER TEXT SEARCH DICTIONARY documents_dict (dummy);

在 上不存在tokenizer_wholeword該dummy選項。 省略值會要求 PostgreSQL 移除這個不存在的選項,這會使快取失效,且不會改變字典中設定的任何選項。

重新載入字典後,透過重寫來源列來重新產生儲存 tsvector 的值:

UPDATE documents SET body = body;

角色與存取權

使用兩個角色來將應用程式存取與代幣化器管理分離:

  • app_role 使用現有字典。 它需要 USAGE 在相關的結構和 SELECT 擴充目錄表上,但不需要擁有字典。
  • tokenizer_admin 管理停止字與同義詞集合,建立並擁有字典與文字搜尋設定,並在更改集合後執行 reload 指令。

授權存取擴充架構與目錄資料表:

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 也需要 CREATE 在儲存字典與文本搜尋配置的結構上。 將這些物件建立為 tokenizer_admin,或將其所有權轉移給該物件。 對目錄資料表的寫入權限並不授予現有字典的所有權。

選項

請在 或 ALTER TEXT SEARCH DICTIONARY中指定tokenizer_wholeword選項CREATE TEXT SEARCH DICTIONARY。 選項名稱不區分大小寫。

Option 類型 預設 Description
Lowercase boolean true 在套用其他操作前,先將標記轉換為小寫。 Stemmer = 'english' 需要 Lowercase = 'true'。
Normalize NFC、NFD、NFKC、NFKD 或 none none 套用所選的 Unicode 正規化形式。 此舉將表示法典化,但不移除字元。 例如, NFC 先組成前 é 置,接 e 著是結合的尖銳重音等效音。
EnglishPossessive boolean true 移除 's後綴 、 ’s,或 's 當至少一個字元在後綴前時。 獨立後綴保持不變。
StripAccents boolean false 套用 NFKD 正規化並移除合併標記。 例如,café 變成 cafe。 啟用此選項時,省略 Normalize ,因為 NFKD 步驟會使任何獨立的 Unicode 正規化變得多餘。
Stopwords 場景名稱 沒有 使用來自 tokenizer_ext.lakebase_tokenizer_stopwords的命名集合。
Synonyms 場景名稱 沒有 使用來自 tokenizer_ext.lakebase_tokenizer_synonyms的命名一對一替換集合。
Stemmer english 沒有 使用捆綁的 Snowball 3.1.0 英文語幹器。 省略這個關閉字幹的選項。 stemmer 不包含停字清單。

目錄表

Table Columns Description
lakebase_tokenizer_stopwords name text、word text 支援 Stopwords的分詞器範本的命名停止字集合儲存。 主索引鍵為 (name, word)。
lakebase_tokenizer_synonyms name text、word text、synonym text 支援 的分詞器範本 Synonyms,商店會指定一對一的替換。 主索引鍵為 (name, word)。

用 BM25 排名搭配lakebase_text

使用文字lakebase_tokenizer搜尋配置所建構的,會產生與 相容lakebase_text的標準 PostgreSQL tsvector 值。 要使用 BM25 相關性排名和 top-K 檢索,請在同一欄位建立 lakebase_bm25 索引 tsvector 。 關於安裝、索引建立及查詢語法,請參見 lakebase_text。

下一步