PostgreSQL-使ts_rank保持ts_vector的位置不变或定义自定义ts_rank函数

Man*_*dez 3 postgresql full-text-search weighted

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

让我用一个例子说明一下:

如果我给ts_vector这个单词camas,它将给我以下内容:

'cam':1
Run Code Online (Sandbox Code Playgroud)

如果我给ts_vector这个单词sofas camas,它将给我以下内容:

'cam':2 'sof':1
Run Code Online (Sandbox Code Playgroud)

因此,camas越来越取决于单词组合不同的位置。

当我执行以下语句时:

select ts_rank(to_tsvector('camas'),to_tsquery('spanish','cama'));
Run Code Online (Sandbox Code Playgroud)

PostgreSQL给我0.0607927ts_rank计算值,而以下语句的计算值:

select ts_rank(to_tsvector('sofas camas'),to_tsquery('spanish','cama'));
Run Code Online (Sandbox Code Playgroud)

是相同的值:0.0607927

怎么会这样?

我想到的问题如下:ts_rank是否有办法按原样考虑ts_vector结构中包含的单词的位置,还是有办法为我定义一个自定义ts_rank函数以采取解释的话?

任何帮助将不胜感激。

小智 5

文档所述,有关函数ts_rankts_rank_cd的信息

他们考虑查询字词在文档中出现的频率,这些字词在文档中的紧密程度以及出现这些字词的文档部分的重要性

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

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)
Run Code Online (Sandbox Code Playgroud)

另外文档说:

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

您可以从GitHub获取PostgreSQL代码。所需的功能是ts_rank_tt