3

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

FRUIT-239476234

如果我尝试用这个做一个 tsquery:

select to_tsquery('FRUIT-239476234');

我得到的是:

'fruit' & '-239476234'

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

239476234

似乎它无法匹配这个,因为它将我的连字符解释为“负号”并且认为不239476234匹配-239476234。我如何告诉 postgres 将我的所有字符都视为文本,而不是试图对数字和连字符变得聪明?

4

2 回答 2

3

来自未来的答案。一旦 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'

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

如果您不想等待 v13,您可以回补此更改并编译成您自己的扩展版本,用于之前的服务器。

于 2020-03-13T19:54:55.127 回答
2

这是由文本搜索解析器完成的,它是不可配置的(缺少用 C 编写自己的解析器,这是受支持的)。

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

于 2020-02-19T07:34:34.347 回答