微信公众号搜"智元新知"关注
微信扫一扫可直接关注哦!

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

如何解决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 举报,一经查实,本站将立刻删除。

相关推荐


Selenium Web驱动程序和Java。元素在(x,y)点处不可单击。其他元素将获得点击?
Python-如何使用点“。” 访问字典成员?
Java 字符串是不可变的。到底是什么意思?
Java中的“ final”关键字如何工作?(我仍然可以修改对象。)
“loop:”在Java代码中。这是什么,为什么要编译?
java.lang.ClassNotFoundException:sun.jdbc.odbc.JdbcOdbcDriver发生异常。为什么?
这是用Java进行XML解析的最佳库。
Java的PriorityQueue的内置迭代器不会以任何特定顺序遍历数据结构。为什么?
如何在Java中聆听按键时移动图像。
Java“Program to an interface”。这是什么意思?