我有一个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编码的粗体字,例如。
'rosegold':26 'sunshine':23 '𝑨𝒍𝒘𝒂𝒚𝒔':1 '𝑯𝒆𝒂𝒓𝒕':4 '𝒊𝒏':2 '𝒎𝒚':3 '𝗗𝗢𝗖𝗘𝗡𝗔𝟭𝟱':21 '𝗗𝗮𝘆':17 '𝗠𝗼𝘁𝗵𝗲𝗿':15
这将导致 @@
操作符要失败,因为 "Always "和 "𝑨𝒍𝒘𝒂𝒚𝒔 "被认为是不同的字。能否在Postgres内将bolditalic UTF8文本覆盖回正常?
编辑:接受的答案完全可以,这是我使用的规则文件。https:/gist.github.comdsenkus9250134b338b9862585963dfdf450e13。
以及用于生成它的脚本。https:/gist.github.comdsenkus17ddbd29d53bd6dd2cf4051bd05ad44d。 (生成的结果需要进行一些清理,因为UTF8中不存在一些特殊的字母,而且第3个h字母不被识别,应使用ℎ作为值)
你需要 不着调 contrib模块。
CREATE EXTENSION unaccent;
然后你需要创建一个文件 my_unaccent.rules
在 tsearch_data
的子目录,其中包含了你需要的字符映射。这是你必须自己建立的东西。
然后你可以用它创建一个字典。
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;
这个全文搜索配置应该是你所需要的。