使用to_tsvector和to_tsquery过滤非罗马字符

时间:2017-01-11 21:53:41

标签: string postgresql search normalization

我想允许对我的应用提供多语言搜索支持。

Postgresql 9.6 Search Controls说我需要tsvectortsquery才能正确解析/规范化文字。这适用于基于罗马语的语言,但不适用于非罗马字符。

考虑此搜索代码段

where to_tsvector(title) @@ to_tsquery('hola')

我正在寻找一个带有" hola mi amiga"的标题,并且它被找到了。但是,鉴于:

where to_tsvector(title) @@ to_tsquery('你') //language = Chinese, Code = zh-CN

我正在寻找一个你好嗎的标题,并且 找不到。

我应该考虑使用字符串规范化来处理非罗马字符?

1 个答案:

答案 0 :(得分:1)

确保正确设置

  

default_text_search_config(字符串)   选择文本搜索功能的那些变体使用的文本搜索配置,这些变体没有指定配置的显式参数。有关详细信息,请参阅第12章。内置的默认值是pg_catalog.simple,但是如果可以识别与该语言环境匹配的配置,initdb将使用与所选lc_ctype语言环境对应的设置初始化配置文件。

您可以使用

查看当前值
SHOW default_text_search_config;
or SELECT get_current_ts_config();

您可以使用SET default_text_search_config = newconfiguration;更改会话,或者使用ALTER DATABASE <db> SET default_text_search_config = newconfiguration

From Chapter 12. Full Text Search

  

在安装过程中,选择了适当的配置,并在postgresql.conf中相应地设置了default_text_search_config。如果您对整个群集使用相同的文本搜索配置,则可以使用postgresql.conf中的值。要在整个群集中使用不同的配置,但在任何一个数据库中使用相同的配置,请使用 ALTER DATABASE ... SET。否则,您可以在每个会话中设置default_text_search_config。

     

依赖于配置的每个文本搜索功能都有一个可选的regconfig参数,因此可以显式指定要使用的配置。 default_text_search_config仅在省略此参数时使用。

您可以使用\dF查看已安装的文字搜索配置。

所以你想要的是这样的

where to_tsvector('newconfig', title) @@ to_tsquery('newconfig', '你')

不知道查询使用什么语言来回答这个问题,或者哪种配置会恰当地阻止该语言。