如何在带数字的字符串上使用 tsvector?
How can I use tsvector on a string with numbers?
我想在包含所有包含数字的字符串的列上使用 postgres tsquery,如下所示:
FRUIT-239476234
如果我尝试从中创建一个 tsquery:
select to_tsquery('FRUIT-239476234');
我得到的是:
'fruit' & '-239476234'
我希望能够仅按此值的数字部分进行搜索,如下所示:
239476234
它似乎无法匹配这个,因为它将我的连字符解释为 "negative sign",并且认为 239476234
不匹配 -239476234
。我如何告诉 postgres 将我的字符 所有 视为文本而不是试图对数字和连字符变得聪明?
这是由不可配置的文本搜索解析器完成的(除了支持用 C 编写您自己的解析器之外)。
最简单的解决方案是通过将 -
替换为 space 来预处理所有搜索字符串。
来自未来的答案。一旦 PostgreSQL 版本 13 发布,您将能够使用 dict_int module 来执行此操作。
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'
但是您最好创建自己的文本搜索词典以及复制 'english' 配置并修改副本,而不是修改默认的。否则您将面临升级会悄无声息地丢失更改的风险。
如果您不想等待 v13,您可以回补 this change 并编译成您自己的先前服务器扩展版本。
我想在包含所有包含数字的字符串的列上使用 postgres tsquery,如下所示:
FRUIT-239476234
如果我尝试从中创建一个 tsquery:
select to_tsquery('FRUIT-239476234');
我得到的是:
'fruit' & '-239476234'
我希望能够仅按此值的数字部分进行搜索,如下所示:
239476234
它似乎无法匹配这个,因为它将我的连字符解释为 "negative sign",并且认为 239476234
不匹配 -239476234
。我如何告诉 postgres 将我的字符 所有 视为文本而不是试图对数字和连字符变得聪明?
这是由不可配置的文本搜索解析器完成的(除了支持用 C 编写您自己的解析器之外)。
最简单的解决方案是通过将 -
替换为 space 来预处理所有搜索字符串。
来自未来的答案。一旦 PostgreSQL 版本 13 发布,您将能够使用 dict_int module 来执行此操作。
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'
但是您最好创建自己的文本搜索词典以及复制 'english' 配置并修改副本,而不是修改默认的。否则您将面临升级会悄无声息地丢失更改的风险。
如果您不想等待 v13,您可以回补 this change 并编译成您自己的先前服务器扩展版本。