簡體   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