使用TSVECTOR和特殊的UTF8字符进行Postgres全文检索。

问题描述 投票:1回答:1

我有一个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字母不被识别,应使用ℎ作为值)

postgresql full-text-search
1个回答
2
投票

你需要 不着调 contrib模块。

CREATE EXTENSION unaccent;

然后你需要创建一个文件 my_unaccent.rulestsearch_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;

这个全文搜索配置应该是你所需要的。

© www.soinside.com 2019 - 2024. All rights reserved.