0

我目前正在我的应用程序上实现搜索功能。我有一个包含用户名和全名字段的用户表。我想搜索具有最佳相似性的用户(来自用户名或全名)。我在 stackoverflow 上进行了很多搜索,发现了一个非常高效的实现: https ://stackoverflow.com/a/44856792/5979369

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

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时它不会返回任何内容。如果我搜索maria,它已经返回了用户。

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

谢谢

4

1 回答 1

1

这里的问题是%运营商。仅当相似度超过pg_trgm.similarity_threshold参数时才会返回 TRUE,默认为 0.3。

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

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

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

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

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

于 2021-06-22T00:58:00.313 回答