可以在Postgres全文搜索中对部分匹配进行排名吗?

时间:2010-02-21 00:43:29

标签: postgresql full-text-search

我正在尝试为全文匹配计算ts_rank,其中查询中的某些字词可能不在与其匹配的ts_vector中。我希望在更多单词匹配的匹配中排名更高。看起来很简单?

由于并非所有条款都必须匹配,我必须|操作数,以提供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的预期较低值,因为'four'不是向量。

但是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 个答案:

答案 0 :(得分:3)

使用smlar扩展名(仅限linux的AFAIK,由带给我们文本搜索的同一个人编写)。

它具有计算阵列之间的TFIDF,余弦或重叠相似性的功能。它支持索引,因此速度很快。

另一种方法是"拼写检查"在使用它之前的查询,基本上删除任何不在您的语料库中的查询术语。

答案 1 :(得分:2)

我得出的结论是将&项目放在一起进行排名。在我的选择查询中(我正在进行搜索),项目为|。这似乎有效。