Postgresql - 与 trigram 的相似性 (pg_trgm)

Postgresql - Similarity with trigram (pg_trgm)

我目前正在我的应用程序中实现搜索功能。我有一个用户 table,其中包含用户名和 full_name 字段。我想搜索具有最佳相似性的用户(来自用户名或 full_name)。我在 Whosebug 上搜索了很多,发现了一个非常高效的实现:

我使用了这段代码并创建了这个搜索查询:

SELECT username, email, full_name
 , similarity(username  , 'mar') AS s_username
 , similarity(full_name , 'mar') AS s_full_name
 , row_number() OVER () AS rank  -- greatest similarity first
FROM   user
WHERE     (username || ' ' || full_name) %   'mar'  -- !!
ORDER  BY (username || ' ' || full_name) <-> 'mar'  -- !!
LIMIT  20;

我有一个用户,用户名是 mariazirita,但是当我使用此查询通过 mar 搜索时,它不会 return 没有什么。如果我搜索 maria,它已经是 return 用户。

当我搜索 marma 时,我可以做些什么来改进此查询 return 用户?

谢谢

这里的问题是 % 运算符。仅当相似度超过 pg_trgm.similarity_threshold 参数(默认为 0.3)时,它才会 return TRUE。

SELECT similarity('mariazirita', 'mar');

 similarity 
════════════
 0.23076923
(1 row)

SELECT similarity('mariazirita', 'maria');

 similarity 
════════════
  0.3846154
(1 row)

因此您可以降低阈值或从查询中删除带有 % 的条件。