Postgresql

Postgres trigram匹配對特定字元表現奇怪

  • July 9, 2019

我正在使用 pg_trgm 執行查詢,但是在使用符號差異進行搜尋時,我得到了很多 1 匹配項。我有以下查詢:

SELECT my_column, similarity('$ Hello', my_column) AS sml
FROM my_table
WHERE my_column % '$ Hello'
ORDER BY sml DESC, my_column;

my_table中,我有以下內容:

- Hello
? Hello
| Hello
$ Hello
! Hello
!? Hello

它們都返回相似匹配為 1。我需要轉義“$”或類似的東西嗎?

其他答案澄清了三元組相似性僅基於字母數字字元。這就是為什麼你所有的例子都匹配 100%。

您仍然可以使用三元組 GiST 或 GIN 索引*,並*ORDER BY使用其他表達式建立所需的排序順序。對於您的展示案例:

SELECT my_column, similarity('$ Hello', my_column) AS sml
FROM   my_table
WHERE  my_column % '$ Hello'
ORDER  BY sml DESC
       , my_column <> '$ Hello'       -- !
       , my_column;

使用此排序順序,布爾表達式的my_column <> '$ Hello'計算結果為FALSETRUENULL- 。所以精確匹配(考慮所有字元)是第一位的。而且這個查詢仍然可以使用三元索引。三元組 GiST 索引(仍然)甚至支持使用**.** 有關的:LIMIT

您可以做更多,這取決於您的確切案例和要求。例子:

...
ORDER  BY sml DESC
       , my_column <> '$ Hello'
       , my_column !~ '\$ Hello'            -- note $ escaped with \$
       , levenshtein(my_column , '$ Hello')
       , my_column;

在相同的三元組相似性中,這首先對完全匹配進行排序,然後是包含確切片語的字元串。並且在每個子組內首先匹配較短的 Levenshtein 距離。字母順序作為最後的決勝局。有關的:

最後但同樣重要的是,您標記**了全文搜尋**。但是您的範例基於 trigram 相似性(由附加模組提供pg_trgm),這是一個完全不同的概念,具有完全獨立的基礎架構和運算符。您可能需要實際的全文搜尋(以及片語搜尋?):

但是標點符號被認為是噪音,在 FTS 中同樣被剝離。同樣的問題”。ts_debug()顯示您的文本搜尋配置如何對給定字元串中的已辨識標記進行分類(simple範例中的配置)。

SELECT * FROM ts_debug('simple', '? Hello %&/( 123');

它從“預設”解析器(目前唯一的一個)開始,將所有這些解析為噪音,開始…

引用自:https://dba.stackexchange.com/questions/242356