Postgresql,tsquery不';我不能用绳子的一部分

Postgresql,tsquery不';我不能用绳子的一部分,sql,postgresql,text-search,tsvector,Sql,Postgresql,Text Search,Tsvector,我正在使用postgres的tsquery函数搜索可能包含多种语言字母和数字的字段。 似乎在每一种情况下,搜索都是搜索短语的一部分,直到你写出完整的短语为止 例如: 当搜索词为“15339”时,搜索名称“15339”将输出右边的行,但如果搜索词为“153”,则不会输出右边的行 搜索Al-Alamya时,如果术语为“Al-”,它将起作用并返回行,但在其后添加字母,例如,“Al-alam”将在我写完全名(“Al-Alamya”)后返回 我的问题是: SELECT * FROM (SELECT DIS

我正在使用postgres的tsquery函数搜索可能包含多种语言字母和数字的字段。 似乎在每一种情况下,搜索都是搜索短语的一部分,直到你写出完整的短语为止

例如: 当搜索词为“15339”时,搜索名称“15339”将输出右边的行,但如果搜索词为“153”,则不会输出右边的行

搜索Al-Alamya时,如果术语为“Al-”,它将起作用并返回行,但在其后添加字母,例如,“Al-alam”将在我写完全名(“Al-Alamya”)后返回

我的问题是:

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
的内容的更多信息。它们支持分组、使用布尔运算进行组合,以及可能需要的前缀。文档中的一个示例:

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

SELECT 'super:*'::tsquery;
此查询将匹配
tsvector
中以“super”开头的任何单词

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

顺便说一句,我不知道您是如何构建数据库模式的,但是您可以使用。我将假设您从
消费者api站点“
列”中生成
消费者api站点“
列“矢量化名称”。如果是这种情况,您可以为该列创建
tsvector
索引,如下所示:

使用gin(to_tsvector('english',name))在消费者api现场创建索引gin_名称
然后您可以更改此查询:

"consumer_api_spot"."vectorized_name" @@ tsquery('153')
为此:

to_tsvector('english', "consumer_api_spot"."name") @@ to_tsquery('english', '153:*')
并获得潜在的速度优势,因为查询将使用索引


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

请检查:A tsquery值存储要搜索的词素。和:。。。词素,即已被规范化以合并同一单词的不同变体的单词。显然,
1234
不是
12345
的标准化形式,它们没有相同或类似的标准化(除非应用了词典)。此外,在文档的同一部分中有以下文本:此外,tsquery中的词素可以用*标记,以指定前缀匹配。