【问题标题】:postgresql multiple column search with rankingpostgresql多列搜索与排名
【发布时间】:2016-08-08 15:47:06
【问题描述】:

我想在多个表中搜索多个列。像这样: 给定表格:

用户 ID 名 姓 电子邮件

公司 用户身份 地址

土地 姓名 company_id

假设用户是在美国华盛顿工作的 Johny Bravo(johny.bravo@gmail.com)。 我想根据查询找到记录 “吃” -> 来自美国,或 来自 Bravo 的“rav”

当我输入“rav”时,我的 Johny Bravo 排名高于其他电子邮件的 Johny Bravo,因此它在结果中排​​名第一

如何实现这样的功能? 我看过 ts_vector 和 ts_rank 但似乎它只支持正确的通配符 ("to_tsquery('Brav:*')") 会起作用,我也不需要全文搜索功能(我会寻找地址和用户名,所以不需要别名等。)我可以进行通配符搜索,但我必须手动计算应用程序中的排名

【问题讨论】:

    标签: postgresql search wildcard pg


    【解决方案1】:

    你可以使用pg_trgm extension

    您必须安装 contrib,然后安装扩展:

    create extension pg_trgm;
    

    然后就可以创建三元索引了:

    create index user_idx on user using gist (user_data gist_trgm_ops);
    

    然后您可以查询哪一个会为您提供前 10 个最相似的值:

    select * from user order by user_data <-> 'rav' limit 10;
    

    请注意,您可以将user_data 替换为不可变函数,该函数可以将所有信息连接到一个(文本)字段中,从而可以跨更多字段进行搜索。

    要获得“排名分数”,您可以使用similarity function,它返回1 表示相同的字符串,0 表示完全不相关的字符串。

    如果您需要跨整个数据库进行全文搜索,更好的解决方案可能是单独的搜索工具,例如 Apache Solr。

    【讨论】:

    • +1 这个答案,我唯一要提到的是使用similarity() 函数为用户提供最相关的结果。
    • 感谢您的回答!相似度函数并不是我想要的。我不想寻找拼写错误,但在多个单词出现时排名更高。当 ohny 在名字、电子邮件和公司名称中时,它的排名更高。有什么想法我可以使用它吗?
    猜你喜欢
    • 2017-04-23
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2020-05-27
    • 2018-04-24
    • 2018-01-21
    • 1970-01-01
    相关资源
    最近更新 更多