我正在尝试为全文匹配计算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
,但它无法解决上述问题。
答案 0 :(得分:3)
使用smlar扩展名(仅限linux的AFAIK,由带给我们文本搜索的同一个人编写)。
它具有计算阵列之间的TFIDF,余弦或重叠相似性的功能。它支持索引,因此速度很快。
另一种方法是"拼写检查"在使用它之前的查询,基本上删除任何不在您的语料库中的查询术语。
答案 1 :(得分:2)
我得出的结论是将&
项目放在一起进行排名。在我的选择查询中(我正在进行搜索),项目为|
。这似乎有效。