我有一张带有句子标题的图像表。给定一个新句子,我想根据新句子与存储的旧句子的接近程度,找到与之最匹配的图像。
我知道我可以将@@
运算符与a一起使用,to_tsquery
但tsquery
可以接受特定单词作为查询。
一个问题是我不知道如何将给定的句子转换为有意义的查询。该句子可能带有标点符号和数字。
但是,我也觉得我需要某种余弦相似性,但我不知道如何从PostgresQL中获得它。我正在使用最新的GA版本,如果可以解决我的问题,很高兴使用开发版本。
您可以习惯于plainto_tsquery()
(根据文档)...
产生
tsquery
忽略标点符号
SELECT plainto_tsquery('english', 'Sentence: with irrelevant words (and punctuation) in it.') plainto_tsquery ------------------ 'sentenc' & 'irrelev' & 'word' & 'punctuat'
像这样使用它:
SELECT * FROM tbl WHERE to_tsvector('english', sentence) @@ plainto_tsquery('english', 'My new sentence');
但这仍然相当严格,并且仅提供非常有限的相似性容忍度。
可能更适合于寻找相似性,甚至在某种程度上克服了错别字。
安装附加模块pg_trgm
,创建GiST索引,并在最近的邻居搜索中使用相似性运算符%
:
基本上,在以下位置具有三字母组合GiST索引sentence
:
-- SELECT set_limit(0.3); -- adjust tolerance if needed SELECT * FROM tbl WHERE sentence % 'My new sentence' ORDER BY sentence <-> 'My new sentence' LIMIT 10;
更多:
使用PostgreSQL快速查找相似的字符串
在PostgreSQL中查找类似的帖子
全文搜索速度慢,出现频率高
您甚至可以结合FTS和三字母组相似度:
PostgreSQL FTS和Trigram相似性查询优化