【发布时间】:2017-04-01 12:40:16
【问题描述】:
只是在我的 Mac 上测试 PostgreSQL 9.6.2 并使用 Ngrams。 假设酒厂领域有一个 GIN trigram 索引。
相似性的限制(我知道这已被弃用):
SELECT set_limit(0.5);
我正在 2,3M 行表上构建三元组搜索。
我的选择代码:
SELECT winery, similarity(winery, 'chateau chevla blanc') AS similarity
FROM usr_wines
WHERE status=1 AND winery % 'chateau chevla blanc'
ORDER BY similarity DESC;
我的结果(在我的 Mac 上为 329 毫秒):
Chateau ChevL Blanc 0,85
Chateau Blanc 0,736842
Chateau Blanc 0,736842
Chateau Blanc 0,736842
Chateau Blanc 0,736842
Chateau Blanc, 0,736842
Chateau Blanc 0,736842
Chateau Cheval Blanc 0,727273
Chateau Cheval Blanc 0,727273
Chateau Cheval Blanc 0,727273
Chateau Cheval Blanc (7) 0,666667
Chateau Cheval Blanc Cbo 0,64
Chateau Du Cheval Blanc 0,64
Chateau Du Cheval Blanc 0,64
好吧,我不明白在这种情况下,“Chateau blanc”如何与“Chateau Cheval Blanc”有相似之处?我知道这两个词是完全相同的“chateau”和“blanc”,但没有其他词“cheval”。
还有为什么“Chateau ChevL Blanc”是第一名?缺少一个字母“a”!
嗯,我的目标是在我给出酒厂名称时匹配所有可能的重复项,即使它拼写错误。我错过了什么?
【问题讨论】:
-
对于“Chateau ChevL Blanc”得分高于“Chateau Cheval Blanc”,pg_trgm 将相似度定义为相对于联合体的交集大小,对拼写错误的定义要严格得多而不是遗漏或添加,因为它们既缩小了交集,又扩大了联合。在实践中,如果您正在实施自己的评分方法,则可能值得考虑诸如相对于两组中较大者的交集的大小。
标签: postgresql similarity trigram