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

时间:2020-06-02 07:04:09

标签: postgresql full-text-search

我有一个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

这会导致@@运算符失败,因为“始终”和“??????”被视为不同的词。在Postgres中是否可以将粗体/斜体UTF8文本恢复为正常?


编辑:可接受的答案非常有效,这是我使用的规则文件:https://gist.github.com/dsenkus/9250134b338b9862585963dfdf450e13

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

1 个答案:

答案 0 :(得分:2)

您需要unaccent贡献模块:

CREATE EXTENSION unaccent;

然后,您需要在PostgreSQL共享目录的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;

这种全文搜索配置应该可以满足您的需求。

相关问题