繁体   English   中英

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

[英]Postgresql, tsquery doesn't work with part of string

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

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

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

我的查询:

SELECT *
FROM (SELECT DISTINCT ON ("consumer_api_spot"."id") "consumer_api_spot"."id",
                                                    "consumer_api_spot"."name",

      FROM "consumer_api_spot"
               INNER JOIN "consumer_api_account" ON ("consumer_api_spot"."account_id" = "consumer_api_account"."id")
               INNER JOIN "users_user" ON ("consumer_api_account"."id" = "users_user"."account_id")

      WHERE (
                    users_user.id = 53 AND consumer_api_spot.active
                    AND
                    "consumer_api_spot"."vectorized_name" @@ tsquery('153')
                )
      GROUP BY "consumer_api_spot"."id"
     ) AS "Q"
LIMIT 50 OFFSET 0

如果您查看文档,您将找到有关可以指定为tsquery的更多信息。 它们支持分组,使用 boolean 操作进行组合,还支持您可能想要的前缀。 文档中的一个示例:

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

 SELECT 'super:*'::tsquery;

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

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

顺便提一句。 我不确切知道您是如何构建数据库架构的,但您可以使用GIN 索引为列添加tsvector索引。 我将假设您从"consumer_api_spot"."name"列生成"consumer_api_spot"."vectorized_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 能够使用索引。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM