Postgresql
Postgres trigram匹配對特定字元表現奇怪
我正在使用 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'
計算結果為FALSE
、TRUE
或NULL
- 。所以精確匹配(考慮所有字元)是第一位的。而且這個查詢仍然可以使用三元索引。三元組 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');
它從“預設”解析器(目前唯一的一個)開始,將所有這些解析為噪音,開始…