PostgreSQL:查找最接近给定句子的句子

时间:2016-01-05 03:29:16

标签: postgresql full-text-search tf-idf cosine-similarity

我有一张带有句子标题的图像表。给定一个新句子,我想根据新句子与存储的旧句子的接近程度找到最匹配的图像。

我知道我可以将@@运算符与to_tsquery一起使用,但tsquery接受特定单词作为查询。

一个问题是我不知道如何将给定的句子转换为有意义的查询。句子可能有标点符号和数字。

然而,我也觉得某种余弦相似性是我需要的,但我不知道如何从PostgresQL中解决这个问题。我正在使用最新的GA版本,我很乐意使用开发版本,如果这样可以解决我的问题。

2 个答案:

答案 0 :(得分:4)

全文搜索(FTS)

您可以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');

但这仍然相当严格,只能提供非常有限的相似容忍度。

Trigram相似度

可能更适合搜索相似性,甚至在某种程度上克服错别字。

安装附加模块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();