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 用户。
当我搜索 mar 或 ma 时,我可以做些什么来改进此查询 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)
因此您可以降低阈值或从查询中删除带有 %
的条件。
我目前正在我的应用程序中实现搜索功能。我有一个用户 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 用户。
当我搜索 mar 或 ma 时,我可以做些什么来改进此查询 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)
因此您可以降低阈值或从查询中删除带有 %
的条件。