Postgresql,tsquery 不适用于部分字符串

问题描述

我正在使用 postgres 的 tsquery 函数在可能包含多种语言和数字的字母的字段中进行搜索。 似乎在每种情况下,搜索都只对搜索到的短语的一部分起作用,并在您写出完整的短语之前停止工作。

例如: 当搜索词为“15339”时,搜索名称“15339”会输出正确的行,但如果是“153”则不会。

搜索 Al-Alamya,如果术语是 'al-' 它将起作用并返回该行,但在此之后添加字母,例如,'al-alam' 在我写完完整内容之前不会返回它姓名('Al-Alamya')。

我的查询

Flutter pub get

解决方法

如果您选中 documentation,您将找到有关可以指定为 tsquery 的内容的更多信息。它们支持分组,使用布尔运算组合,还支持前缀,这可能是您想要的。文档中的一个示例:

此外,tsquery 中的词素可以用 * 标记以指定前缀匹配:

SELECT 'super:*'::tsquery;

此查询将匹配 tsvector 中以“super”开头的任何单词。

因此在您的查询中,您应该将 tsquery('153') 的部分修改为 tsquery('153:*')

顺便说一句。我不知道您究竟是如何构建数据库架构的,但您可以使用 GIN index 为列添加 tsvector 索引。我假设您从 "consumer_api_spot"."vectorized_name" 列生成 "consumer_api_spot"."name" 列。如果是这种情况,您可以为该列创建一个 tsvector 索引,如下所示:

CREATE INDEX gin_name on consumer_api_spot using gin (to_tsvector('english',name))

然后您可以更改此查询:

"consumer_api_spot"."vectorized_name" @@ tsquery('153')

进入这个:

to_tsvector('english',"consumer_api_spot"."name") @@ to_tsquery('english','153:*')

并获得潜在的速度优势,因为查询将使用索引。

关于'english'的注意事项:创建索引时不能省略语言,但它不会影响其他语言的查询或数字查询。但是,请注意,创建索引和执行查询的语言必须相同才能使 PostgreSQL 使用索引。