2010-02-21 66 views
4

我试图计算一个全文匹配的ts_rank,其中查询中的某些术语可能不在与其匹配的ts_vector中。我希望在更多单词匹配的比赛中排名更高。看起来很简单?可能在Postgres全文搜索中对部分匹配进行排名?

因为不是所有的条件都必须匹配,所以我必须|的操作数,给出如to_tsquery('one|two|three')(如果它是&,所有都必须匹配)的查询。

问题是,无论有多少单词匹配,排名值似乎是相同的。换句话说,它是最大的而不是乘以子句。

select ts_rank('one two three'::tsvector, to_tsquery('one'));给出0.0607927

select ts_rank('one two three'::tsvector, to_tsquery('one|two|three|four')); 给出了预期的较低值0.0455945,因为'四'不是矢量。

select ts_rank('one two three'::tsvector, to_tsquery('one|two'));

0.0607927,同样

select ts_rank('one two three'::tsvector, to_tsquery('one|two|three'));

0.0607927

我想的ts_rank的结果是如果有更多的条件匹配更高。

可能吗?

为了反击一个可能的反应:我无法计算搜索查询的所有可能子序列作为交集,然后将它们全部结合在一个查询中,因为我将要处理大量查询。无论如何,我肯定有很多争论!

编辑:我知道ts_rank_cd但它不能解决上述问题。

回答

2

使用smlar扩展名(linux only AFAIK,由带给我们文本搜索的相同家伙编写)。

它具有计算TFIDF,余弦或数组之间重叠相似度的函数。它支持索引,因此速度很快。

另一种方式是在使用它之前对查询进行“拼写检查”,基本上删除任何不在您的语料库中的查询词。

+0

非常感谢。奇怪的是,看到四年前我遇到的问题的答案! – Joe 2014-07-30 09:22:33

+1

我喜欢冷酷的情况 – 2014-07-30 17:09:55

2

我得出的结论是&这些项目一起进行排名。在我选择的查询中(我正在使用它进行搜索),这些项目是| ed。这似乎工作。