我有一张带有句子标题的图像表。给定一个新句子,我想根据新句子与存储的旧句子的接近程度找到最匹配的图像。
我知道我可以将@@
运算符与to_tsquery
一起使用,但tsquery
接受特定单词作为查询。
一个问题是我不知道如何将给定的句子转换为有意义的查询。句子可能有标点符号和数字。
然而,我也觉得某种余弦相似性是我需要的,但我不知道如何从PostgresQL中解决这个问题。我正在使用最新的GA版本,我很乐意使用开发版本,如果这样可以解决我的问题。
答案 0 :(得分:4)
您可以plainto_tsquery()
使用{per documentation)...
生成
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索引并使用最近邻搜索中的similarity operator %
:
基本上,sentence
上的三元组GiST索引:
-- 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;
更多:
您甚至可以将FTS和三元组相似性结合起来:
答案 1 :(得分:1)
这是一个很晚的答案,但我要补充一下,以防有人遇到。如果在单词的末尾添加“:*”,则会弹出类似的单词。 样品: JS自动完成-> Codeigniter:
条形码= $ this->输入-> get(“条件”)。 “:*”;
查询: $ query ='select * from tablaneme其中xx @@? LIMIT 15'; $条形码查询= $ this->数据库->查询($查询,数组(爆炸(“”,$条码))))-> result_array();