最后一列image_hash
包含图像文件(varchar
)的图像哈希。
我的目标是在此列上创建唯一约束,但它应遵循一个特定条件。
例如,如果image_hash 1和image_hash 2相同-则相似度为1
如果它们完全不同-相似度→0
出于相似性考虑,我认为汉明差异应该很合适。
条件是:
如果image_hash 1和image hash2的相似性差异小于X(例如0.1),则哈希被认为是相同的,这将违反唯一性。
如果相似度大于X,则不违反唯一约束。
我尝试过:
SELECT image_hash, similarity(image_hash, '00041dffff101800') AS sml
FROM archives_imagemodel
WHERE id=431
但这是敏感的方法,我仍然不知道如何将其转换为唯一约束。
我在Postgres中表现不佳,因此,如果问题很愚蠢或不切实际,对不起
有什么想法吗?
谢谢
答案 0 :(得分:1)
从原则上讲这是可能的,但需要使用C语言编写一个扩展程序,以提供:
实现汉明距离的相似性运算符。如果相似地超过阈值,它将返回TRUE
。
text
的GiST运算符类,支持该运算符。
然后,您可以使用该运算符创建排除约束,该约束将完全满足您的要求。但是请注意,您必须为此而沉浸在PostgreSQL的内部(但是您不必修改服务器)。
一种更普通的方法是使用触发器,但是如果没有如上所述的GiST索引,则意味着需要对每个数据修改进行顺序扫描,这会降低性能。此外,除非您使用SERIALIZABLE
隔离级别,例如triggers are subject to race conditions。