使用 TSVECTOR 和特殊 UTF8 字符的 Postgres 全文搜索

Postgres Full Text Search using TSVECTOR and special UTF8 characters

我有一个需要可搜索的 Instagram 帖子数据库。当前实现使用 TSVECTOR 列和 @@ 运算符对其进行搜索:

CREATE TABLE ig_posts (
 /* ... */
 caption_tsv TSVECTOR
);

帖子插入 SQL:

INSERT INTO ig_posts(caption_tsv)
VALUES (to_tsvector('simple', ?)) /* simple, because post can be in any language */

搜索SQL:

SELECT *
FROM ig_posts
WHERE ig_posts.caption_tsv @@ to_tsquery('simple', ?)

一切正常,除了一些帖子可能包含 utf8 编码的 bold/italic 文本,例如:

'rosegold':26 'sunshine':23 '':1 '':4 '':2 '':3 '':21 '':17 '':15

这会导致 @@ 运算符失败,因为 "Always" 和 "" 被认为是不同的词。是否可以在 Postgres 中将 bold/italic UTF8 文本转换回正常状态?


编辑:接受的答案完美无缺,这是我使用的规则文件:https://gist.github.com/dsenkus/9250134b338b9862585963dfdf450e13

以及用于生成它的脚本:https://gist.github.com/dsenkus/17ddbd29d53bd6dd2cf4051bd05ad44d(生成的结果需要一些清理,因为 UTF8 中不存在一些特殊字母,并且无法识别第 3 个 h 字母,ℎ 应该用作值)

您需要 unaccent 贡献模块:

CREATE EXTENSION unaccent;

然后您需要在 PostgreSQL 共享目录的 tsearch_data 子目录中创建一个文件 my_unaccent.rules,其中包含您需要的字符映射。这是你必须自己建立的东西。

然后你可以使用它创建一个字典:

CREATE TEXT SEARCH DICTIONARY my_unaccent (TEMPLATE = unaccent, RULES = 'my_unaccent');

然后您可以根据使用该词典的 simple 创建一个新的文本搜索配置:

CREATE TEXT SEARCH CONFIGURATION my_unaccent (COPY = simple);
ALTER TEXT SEARCH CONFIGURATION my_unaccent
   ALTER MAPPING FOR asciihword, asciiword, hword, hword_asciipart, hword_part, word
      WITH my_unaccent, simple;

此全文搜索配置应该满足您的需要。