使用 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;
此全文搜索配置应该满足您的需要。
我有一个需要可搜索的 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;
此全文搜索配置应该满足您的需要。