如何在带有数字的字符串上使用 tsvector?

Ter*_*ers 5 postgresql tsvector

我想在包含所有包含数字的字符串的列上使用 postgres tsquery,如下所示:

FRUIT-239476234
Run Code Online (Sandbox Code Playgroud)

如果我尝试从中创建一个 tsquery:

select to_tsquery('FRUIT-239476234');
Run Code Online (Sandbox Code Playgroud)

我得到的是:

'fruit' & '-239476234'
Run Code Online (Sandbox Code Playgroud)

我希望能够仅通过该值的数字部分进行搜索,如下所示:

239476234
Run Code Online (Sandbox Code Playgroud)

似乎它无法匹配它,因为它将我的连字符解释为“负号”并且不认为239476234匹配-239476234。我怎样才能告诉 postgres 将我的所有字符视为文本而不是试图聪明地处理数字和连字符?

jja*_*nes 5

来自未来的答案。一旦 PostgreSQL 版本 13 发布,您将能够使用dict_int 模块来执行此操作。

create extension dict_int ;
ALTER TEXT SEARCH DICTIONARY intdict (MAXLEN = 100, ABSVAL=true);
ALTER TEXT SEARCH CONFIGURATION english ALTER MAPPING FOR int WITH intdict;
select to_tsquery('FRUIT-239476234');

      to_tsquery       
-----------------------
 'fruit' & '239476234'
Run Code Online (Sandbox Code Playgroud)

但是您可能最好创建自己的文本搜索字典以及复制“英语”配置并修改副本,而不是修改默认的配置。否则,您将面临升级会悄悄丢失所做更改的风险。

如果您不想等待 v13,您可以对此更改进行反向修补并编译到您自己的先前服务器版本的扩展中。


Lau*_*lbe 2

这是由文本搜索解析器完成的,该解析器是不可配置的(无法用 C 语言编写自己的解析器,这是受支持的)。

-最简单的解决方案是通过替换为空格来预处理所有搜索字符串。