| 123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104 |
- -- 创建表结构
- CREATE TABLE fts_texts (
- paragraph integer,
- book integer,
- wid varchar(50),
- -- 单个出现的黑体字,权重较大
- bold_single text,
- -- 成对出现的黑体字,权重一般
- bold_double text,
- -- 连续三个或三个以上的黑体字,权重较低
- bold_multiple text,
- content text
- );
- -- 创建全文检索配置 pali
- CREATE TEXT SEARCH CONFIGURATION pali ( parser = pg_catalog.default );
- -- 创建全文检索配置 pali_unaccent 无标音符号版
- CREATE TEXT SEARCH CONFIGURATION pali_unaccent ( parser = pg_catalog.default );
- -- 创建巴利语词形转换字典
- CREATE TEXT SEARCH DICTIONARY pali_stem (
- TEMPLATE = synonym,
- SYNONYMS = pali
- );
- -- 创建巴利语停用词字典
- CREATE TEXT SEARCH DICTIONARY pali_stopwords (
- TEMPLATE = pg_catalog.simple, STOPWORDS = pali,
- ACCEPT = true
- );
- -- 修改全文检索配置 pali 使用我们创建的字典
- ALTER TEXT SEARCH CONFIGURATION pali
- ADD MAPPING FOR asciiword, word, hword_part, hword_asciipart
- WITH pali_stem, pali_stopwords;
- -- 修改全文检索配置 pali_unaccent 使用我们创建的字典
- CREATE EXTENSION IF NOT EXISTS "unaccent";
- ALTER TEXT SEARCH CONFIGURATION pali_unaccent
- ADD MAPPING FOR asciiword, word, hword_part, hword_asciipart
- WITH unaccent, pali_stem, pali_stopwords;
- -- 添加自动更新的 TSVECTOR 字段
- ALTER TABLE fts_texts
- ADD COLUMN full_text_search_weighted TSVECTOR
- GENERATED ALWAYS AS (
- setweight(to_tsvector('pali', coalesce(content,'')), 'A') || ' ' ||
- setweight(to_tsvector('pali', coalesce(bold_single,'')), 'B') || ' ' ||
- setweight(to_tsvector('pali', coalesce(bold_double,'')), 'C') || ' ' ||
- setweight(to_tsvector('pali', coalesce(bold_multiple,'')), 'D')
- ) STORED;
- ALTER TABLE fts_texts
- ADD COLUMN full_text_search_weighted_unaccent TSVECTOR
- GENERATED ALWAYS AS (
- setweight(to_tsvector('pali_unaccent', coalesce(content,'')), 'A') || ' ' ||
- setweight(to_tsvector('pali_unaccent', coalesce(bold_single,'')), 'B') || ' ' ||
- setweight(to_tsvector('pali_unaccent', coalesce(bold_double,'')), 'C') || ' ' ||
- setweight(to_tsvector('pali_unaccent', coalesce(bold_multiple,'')), 'D')
- ) STORED;
- -- 为该字段创建索引
- CREATE INDEX full_text_search_weighted_idx
- ON fts_texts USING GIN (full_text_search_weighted);
- CREATE INDEX full_text_search_weighted__unaccent_idx
- ON fts_texts USING GIN (full_text_search_weighted_unaccent);
- -- 创建查询函数
- CREATE OR REPLACE FUNCTION query_pali(query_str TEXT)
- RETURNS TABLE(
- rank NUMERIC,
- paragraph INTEGER,
- wid VARCHAR,
- bold_single TEXT,
- bold_double TEXT,
- bold_multiple TEXT,
- content TEXT,
- full_text_search_weighted TSVECTOR,
- full_text_search_weighted_unaccent TSVECTOR)
- AS $$
- SELECT
- ts_rank('{0.1, 0.2, 0.4, 1}',
- full_text_search_weighted,
- websearch_to_tsquery('pali', query_str)) +
- ts_rank('{0.1, 0.2, 0.4, 1}',
- full_text_search_weighted_unaccent,
- websearch_to_tsquery('pali_unaccent', query_str)), -- AS rank
- paragraph, wid, bold_single, bold_double, bold_multiple, content,
- full_text_search_weighted, full_text_search_weighted_unaccent
- FROM fts_texts
- WHERE
- full_text_search_weighted @@ websearch_to_tsquery('pali', query_str) OR
- full_text_search_weighted_unaccent @@ websearch_to_tsquery('pali_unaccent', query_str);
- $$ LANGUAGE SQL;
|