lakebase_tokenizer

Bu uzantı lakebase_tokenizer , Lakebase'te PostgreSQL tam metin aramasına yapılandırılabilir tam kelime tokenizasyonu ekliyor. Uzantıyla oluşturulan metin arama yapılandırmaları, operatör, @@ sıralama fonksiyonları ve GIN indeksleriyle çalışırto_tsvector. Ayrıca BM25 sıralaması için oluşturulan tsvector değerleri lakebase_text de kullanabilirsiniz.

Bu uzantı, şablonu tokenizer_wholeword PostgreSQL'in standart metin arama sözlüğü arayüzü aracılığıyla sağlar. Şablon, küçük harf dönüştürme, Unicode normalizasyonu, aksan kaldırma, İngilizce sahiplik kaldırma, özel durma kelimeleri, bire bir eşanlamlı kelimeler ve İngilizce stem-inglem desteğini destekler.

Install

Uzantını veritabanınıza yükleyin. Bu sayfadaki örnekler, uzantı nesnelerinin kolayca tanımlanmasını sağlamak için özel bir şema kullanır:

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

Uzantı taşınabilir. Kurulumda başka bir şema ile değiştirebilirsiniz tokenizer_ext .

Uzantıyı yükseltme

Yeni bir Lakebase Search sürümü özellikler, düzeltmeler ve performans iyileştirmeleri ekleyebilir. PostgreSQL, yüklü uzantı sürümünü otomatik olarak güncellemez. Kurulu ve en güncel sürümleri kontrol edin:

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

Uzantıyı en son mevcut sürüme güncelledin:

ALTER EXTENSION lakebase_tokenizer UPDATE;

ALTER EXTENSION saklanan tsvector değerleri yenilemez veya bağımlı GIN veya lakebase_bm25 indeksleri yeniden oluşturmaz. Bir güncelleme tokenizasyon çıktısını değiştirirse, depolanmış tsvector değerleri yeniden oluşturun ve gerekli endeks bakımı için sürüm notlarını takip edin.

Hızlı bir başlangıç tokenizer_wholeword

Aşağıdaki örnek, şablondan tokenizer_wholeword bir sözlük oluşturur ve ardından yaygın PostgreSQL token türlerini metin arama yapılandırmasında ona eşler:

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;

Yapılandırmayı kullanarak bir tsvector, bir GIN indeksi oluşturun ve tam metin sorguları çalıştırın:

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

Belgeler ve sorgular için aynı metin arama yapılandırmasını kullanın, böylece her iki taraf da aynı tokenizasyon stratejisi ve seçeneklerini uygulayabilir.

Şablon: tokenizer_wholeword

Nasıl çalışır?

PostgreSQL'in metin arama ayrıştırıcısı tokenizer_wholeword tarafından sözlüğe iletilen her belirteç için şu işlemler uygulanır:

  1. Lowercase: Tokenı küçük harfe dönüştürün.
  2. Normalize: Unicode normalizasyonunu uygula.
  3. StripAccents: Vurguları kaldırın.
  4. EnglishPossessive: En az bir karakter kaldığında İngilizce sahiplik eki kaldırılır.
  5. Stopwords: Belirteç yapılandırılmış bir durdurma kelimesine uyuyorsa lexeme yaymayın ve işlemeyi durdurun. Token, üretilen tsvector'den çıkarılmıştır.
  6. Synonyms: Yapılandırılmış değişimi yayım ve token eşanlamlısıyla eşleşirse işlemi durdurur.
  7. Stemmer: Eğer eşanlamlı bir eşleşme yoksa ve kök kullanımı etkinleştirilmemişse, İngilizce stemmer'i uygulayın.

Durak kelimeler ve eşanlamlılar ekleyin

Şablon, tokenizer_wholeword uzantılarla yönetilen SQL tablolarından lakebase_tokenizer_stopwords özel durak kelimeleri ve eşanlamlıları yükleyebilir ve lakebase_tokenizer_synonyms. Sütun, name satırları veya sözlük seçeneğiyle seçtiğiniz StopwordsSynonyms bir kümeye gruplar.

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

Bir tokenizer_wholeword sözlük oluştururken veya değiştirirken kümelere referans verin:

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

Uzantı, ve EnglishPossessiveuygulandıktan StripAccentsNormalizeLowercasesonra ancak uygulanmadan Stemmerönce her belirteçle durak kelimeleri ve eşanlamlı kaynak kelimeleri karşılaştırır. Katalog girişleri otomatik olarak dönüştürülmez, bu yüzden bu etkinleştirilmiş seçeneklerin oluşturduğu tam biçimde saklanırlar:

  • Ile Lowercase = 'true'ise küçük harfler kullanın. Ile Lowercase = 'false'ise büyük harf belirti tokenla eşleşmelidir.
  • Etkinleştirildiğinde Normalize , girişleri seçilmiş Unicode normalizasyon formunda depolayın.
  • Ile StripAccents = 'true'desenli formu depolayın. Örneğin, eşleştirmek caféiçin depolacafe.
  • Sap yapmadan önce formu saklayın. Örneğin, ile Stemmer = 'english'bir run girdi runningeşleşmez. O tokenı filtrelemek için ekleyin running veya değiştirin.

Küme adları en fazla 256 bayt içerebilir. Kelimeler ve eşanlamlılar en fazla 1024 bayt içerebilir. Her adlandırılmış durak kelime veya eşanlamlı küme, 100.000'e kadar satır içerebilir.

Bir eşanlamlı ikame tam olarak depolandığı gibi yayılır ve stemmer tarafından işlemez. Eşanlamlılar, her kaynak kelime için bir yer değiştirmeyi destekler. Çok kelimeli bir kelime yerine bir sözlük olarak temsil etmek için, alt çizgi gibi bir ayırıcı kullanın; örneğin .united_states

Bir küme değiştirildikten sonra, kümeye referans veren her sözlüğün sahibi, yeniden yüklemeyi zorlamak için bir no-op ALTER TEXT SEARCH DICTIONARY çalıştırmalıdır:

ALTER TEXT SEARCH DICTIONARY documents_dict (dummy);

dummy Bu seçenek 'de tokenizer_wholewordyok. Bir değerin atılması PostgreSQL'den bu var olmayan seçeneği kaldırmasını ister; bu da önbelleği geçersiz hale getirir ve hiçbir yapılandırılmış seçenek değişmez.

Sözlük yeniden yüklendikten sonra, kaynak satırlar yeniden yazarak depolanan tsvector değerleri yeniden üretin:

UPDATE documents SET body = body;

Roller ve erişim

Uygulama erişimini tokenizer yönetiminden ayırmak için iki rol kullanın:

  • app_role mevcut sözlükleri kullanır. İlgili şemalarda ve SELECT uzantı katalog tablolarında olması USAGE gerekir, ancak sözlüklere sahip olması gerekmez.
  • tokenizer_admin durak kelime ve eşanlamlı setleri yönetir, sözlükler ve metin arama yapılandırmaları oluşturur ve sahiplenir, ayrıca bir küme değiştikten sonra yeniden yükleme komutunu çalıştırır.

Uzantı şemasına ve katalog tablolarına erişim izni verin:

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 ayrıca CREATE şemada da gereksinimler vardır; burada sözlükler ve metin arama yapılandırmaları saklanır. Bu nesneleri , tokenizer_adminolarak yaratın veya sahipliklerini ona devredin. Katalog tablolarına yazı erişimi, mevcut sözlüklerin sahipliğini sağlamaz.

Options

Seçenekler tokenizer_wholeword için CREATE TEXT SEARCH DICTIONARY veya ALTER TEXT SEARCH DICTIONARYbelirtin. Seçenek isimleri büyük harf duyarsızdır.

Seçenek Türü Varsayılan Description
Lowercase boolean true Tokenları diğer işlemler uygulamadan önce küçük harflere dönüştürür. Stemmer = 'english' gerektirir Lowercase = 'true'.
Normalize NFC, NFD, NFKC, NFKDveya none none Seçilen Unicode normalizasyon formunu uygular. Bu, temsili kanonikleştirir ancak karakterleri kaldırmaz. Örneğin, NFC önceden kompozisyona é alınmış ve e ardından birleşen akut aksan eşdeğeri ile takip edilir.
EnglishPossessive boolean true En az bir karakter ekten önce geldiğinde arkasındaki 's, ’s, 's veya kaldırılır. Bağımsız bir ek ise değişmeden kalır.
StripAccents boolean false NFKD normalizasyonu uygular ve birleştirme işaretlerini kaldırır. Örneğin café, cafe olur. Bu seçenek etkinleştirildiğinde, NFKD adımı herhangi ayrı bir Unicode normalizasyonunu gereksiz hale getirdiği için çıkarabilirsiniz Normalize .
Stopwords Set adı None Adı verilen kümeyi kullanır.tokenizer_ext.lakebase_tokenizer_stopwords
Synonyms Set adı None 'den bire bir yer tokenizer_ext.lakebase_tokenizer_synonymsdeğiştirme setini kullanır.
Stemmer english None Paketli Snowball 3.1.0 İngilizce stemmer'i kullanıyor. Stemming'i devre dışı bırakmak için bu seçeneği çıkarın. Kök kelimesi duraklama listesi içermez.

Katalog tabloları

Masa Columns Description
lakebase_tokenizer_stopwords name text, word text Tokenizer şablonlarını Stopwordsdestekleyen stop-word setleri depolar. Birincil anahtardır (name, word).
lakebase_tokenizer_synonyms name text, word text, synonym text Mağazalar, tokenizer şablonlarını destekleyen Synonymsbire bir yerine geçimler adlandırdı. Birincil anahtardır (name, word).

BM25 sıralamasını lakebase_text ile kullanın

Metin arama yapılandırmaları lakebase_tokenizer ile uyumlu standart PostgreSQL tsvector değerleri lakebase_textüretir. BM25 ilgililik sıralaması ve top-K geri dönüşünü kullanmak için aynı tsvector sütunda bir lakebase_bm25 indeks oluşturun. Kurulum, indeks oluşturma ve sorgu sözdizimi için bkz.lakebase_text

Sonraki Adımlar