PostgreSQL-使ts_RANK按原样接受ts_VECTOR位置或定义自定义的ts_RANK函数 [英] PostgreSQL - making ts_rank take the ts_vector position as-is or defining a custom ts_rank function

查看:0
本文介绍了PostgreSQL-使ts_RANK按原样接受ts_VECTOR位置或定义自定义的ts_RANK函数的处理方法,对大家解决问题具有一定的参考价值,需要的朋友们下面随着小编来一起学习吧!

问题描述

我在一家电子商务平台上对一系列商品进行加权搜索。我遇到的问题是ts_rank为不同的单词组合提供了完全相同的值,即使ts_VECTOR为每组单词提供了不同的位置。

让我举个例子来说明一下:

如果我将单词camas赋给ts_VECTOR,则会得到以下结果:

'cam':1

如果我将单词sofas camas赋给ts_VECTOR,则会得到以下结果:

'cam':2 'sof':1

因此camas根据单词组合的不同而获得不同的位置。

当我执行以下语句时:

select ts_rank(to_tsvector('camas'),to_tsquery('spanish','cama'));

PostgreSQL给出的0.0607927作为ts_ranch的计算值,而以下语句的计算值:

select ts_rank(to_tsvector('sofas camas'),to_tsquery('spanish','cama'));

是相同的值:0.0607927

怎么会这样?

我脑海中的问题是:ts_rank是否有办法按原样考虑ts_VECTOR结构中包含的单词的位置,或者是否有方法定义一个自定义的ts_ranch函数,以便我接受解释的单词的位置?

如有任何帮助,我们将不胜感激。

推荐答案

作为documentation关于函数ts_RANKts_RANK_cd的SAI:

它们考虑查询词语在文档中出现的频率、词语在文档中的距离以及它们在文档中出现的部分的重要性

也就是说,这些函数忽略计算中的其他单词。例如,您可以针对以下查询获得不同的结果:

postgres=# select ts_rank(to_tsvector('spanish', 'famoso sofas camas'),to_tsquery('spanish','famoso & cama'));
  ts_rank  
-----------
 0.0985009
(1 row)

postgres=# select ts_rank(to_tsvector('spanish', 'famoso camas'),to_tsquery('spanish','famoso & cama'));
  ts_rank  
-----------
 0.0991032
(1 row)

postgres=# select ts_rank(to_tsvector('spanish', 'sofas camas camas'),to_tsquery('spanish','cama'));
  ts_rank  
-----------
 0.0759909
(1 row)

还有文档SAIS:

不同的应用程序可能需要其他信息进行排名,例如文档修改时间。内置的排名函数仅是示例。您可以编写自己的排名函数和/或将其结果与其他因素相结合,以满足您的特定需求。

您可以从GitHub获取PostgreSQL代码。所需函数为TS_RANK_TT

这篇关于PostgreSQL-使ts_RANK按原样接受ts_VECTOR位置或定义自定义的ts_RANK函数的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!

查看全文
登录 关闭
扫码关注1秒登录
发送“验证码”获取 | 15天全站免登陆