如何解决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 使用索引。
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。