我想要一些技术来解决我的问题。我正在使用Postgresql 10。 我想创建一个即使两个字母相差也可以选择子字符串的查询。我的语言是葡萄牙语,有许多声音相同的字母,人们在打字时确实会犯错误。 大概我想做的就是这个。
如果我的产品名称为“automóvelgrande”
atomóvel grande" would match //one letter is missing
automovel grnde" would match //lack accent and letter is missing
automovell grnde would match // lack of accent and the "l" was repeated
我以前使用过pg_trgm,在我的记忆中它起作用了,但是现在,我再次使用它,我确实得到了一些奇怪的结果。
我正在使用这样的设置:
ALTER DATABASE mydb SET pg_trgm.word_similarity_threshold = 0.2;
在键入“ capoceti”时,无法匹配“ capacete”。
我认为这两个词足够相似。更改阈值不会影响结果。
答案 0 :(得分:4)
我建议使用Levenshtein距离(https://en.wikipedia.org/wiki/Levenshtein_distance)。这是您需要将一个字符串更改为另一个字符串的操作数,包括插入,删除或另一个更改字母。
首先,通过运行以下命令创建扩展名:
CREATE EXTENSION fuzzystrmatch;
然后,您可以使用levenshtein (string1, string2)
查找string1和string2之间的距离(整数)。在对列运行levenstein后,请过滤2或更小的距离。
根据您的情况,请尝试以下操作:
Select levenshtein('capacete', 'capoceti')
,您将得到2的距离。
有关postgres字符串相似性的更多信息,请参见此处:https://www.postgresql.org/docs/9.1/fuzzystrmatch.html