Postgresql 模糊搜索

Posted

技术标签:

【中文标题】Postgresql 模糊搜索【英文标题】:Postgresql Fuzzy Search 【发布时间】:2021-11-20 06:12:37 【问题描述】:

请原谅这个一般性问题。我在 PostgreSQL 中创建了一个巨大的模糊搜索函数,它使用相似度、Soundex、Metaphone、Levenshtein 和其他类型的逻辑比较。我已经为每个结果设置了加权值。该功能已经增长以改善结果,但它很慢而且仍然不是很好!我花了很多时间研究和搜索比我更聪明的人创建的模糊搜索!

有谁知道 PostgreSQL 的一个很棒的模糊搜索功能,它比较两个字符串并产生一个可以排序的分数?我希望有一些可以像这样工作的东西:

SELECT tbl_name_column, blur_function(tbl_name_column, '最像这个字符串') 作为分数 来自 tbl ORDER BY score desc

【问题讨论】:

这能回答你的问题吗? How to create simple fuzzy search with PostgreSQL only? 【参考方案1】:

pg_trgm 扩展提供了 Trigram 评分,但还有 this answer 中提到的 fuzzystrmatch 扩展提供其他算法支持(当前的 PG 文档 [v14] 警告说除了 levenshtein() 函数之外的所有内容都没有与 UTF-8 等多字节编码配合良好,因此请注意)。

pg_trgm:

SELECT 
    tbl_name_column, 
    similarity(tbl_name_column, 'search string') AS score 
FROM tbl 
ORDER BY score DESC; -- Trigram score increases with similarity

模糊匹配:

SELECT 
    tbl_name_column, 
    levenshtein(tbl_name_column, 'search string') AS score 
FROM tbl 
ORDER BY score ASC; --levenshtein distance decreases with similarity

【讨论】:

以上是关于Postgresql 模糊搜索的主要内容,如果未能解决你的问题,请参考以下文章

ES实现模糊搜索

C# combobox 模糊搜索。

关于Lucene怎么使用SpanQuery进行模糊搜索

mysql怎么实现全局的模糊搜索?

抛弃mysql模糊查询,使用sphinx做专业索引

搜索框实现模糊查询方法 - js