Postgresql 两个ts向量列之间的ts_秩

Postgresql 两个ts向量列之间的ts_秩,postgresql,full-text-search,Postgresql,Full Text Search,我在两个表中有两列,我想选择前20%最相关的术语 Table A: items id, title (string) Table B: queries id, query (string) 基本上,我想找到ts\u向量(items.title)和ts\u向量(querys.query)您可以使用ts\u rank\u cd(tsquery,tsvector,int)获得文本接近度。我用您的列创建了两个表a和b,并将信息放在上面。ts_rank_cd函数接收一个要规格化的因子,在文档中,32

我在两个表中有两列,我想选择前20%最相关的术语

Table A: items
id, 
title (string)

Table B: queries
id,
query (string)

基本上,我想找到ts\u向量(items.title)ts\u向量(querys.query)

您可以使用
ts\u rank\u cd(tsquery,tsvector,int)
获得文本接近度。我用您的列创建了两个表
a
b
,并将信息放在上面。ts_rank_cd函数接收一个要规格化的因子,在文档中,
32
是要在
0
1
之间规格化的值。它不被认为是
0%
100%
的索引,但它被认为是一个很好的接近系数,如中所述

表a:

postgres=# select * from a;
 id |       title        
----+--------------------
  1 | a rat and a cat
  2 | a cat and a mouse
  3 | a tiger or a rhino
(3 rows)
表b:

postgres=# select * from b;
 id |      query      
----+-----------------
  4 | lorem ipsum
  3 | lorem cat
  2 | mouse rhino
  1 | a rat and a cat
  5 | rat fat cat
(5 rows)
需要使用
tsu rank\u cd(tsvector,tsquery)
执行比较,因此,我们将第一个
a.title
转换为
tsvector
,将
b.query
转换为
tsquery
,并进行比较

postgres=# select ts_rank_cd(to_tsvector(title), query, 32) as rank, 
                  title,
                  query 
             from a, 
                  (select plainto_tsquery('english', query) as query,
                          id
                     from b
                  ) AS b ORDER BY rank DESC; 

   rank    |       title        |         query         
-----------+--------------------+-----------------------
 0.0322581 | a rat and a cat    | 'rat' & 'cat'
         0 | a rat and a cat    | 'lorem' & 'cat'
         0 | a rat and a cat    | 'mous' & 'rhino'
         0 | a rat and a cat    | 'rat' & 'fat' & 'cat'
         0 | a cat and a mouse  | 'lorem' & 'ipsum'
         0 | a cat and a mouse  | 'lorem' & 'cat'
         0 | a cat and a mouse  | 'mous' & 'rhino'
         0 | a cat and a mouse  | 'rat' & 'cat'
         0 | a cat and a mouse  | 'rat' & 'fat' & 'cat'
         0 | a tiger or a rhino | 'lorem' & 'ipsum'
         0 | a tiger or a rhino | 'lorem' & 'cat'
         0 | a tiger or a rhino | 'mous' & 'rhino'
         0 | a tiger or a rhino | 'rat' & 'cat'
         0 | a rat and a cat    | 'lorem' & 'ipsum'
         0 | a tiger or a rhino | 'rat' & 'fat' & 'cat'
(15 rows)
如果你想得到一个更“轻松”的结果,你可以用
|
替换
&
,只做一个替换

postgres=# select ts_rank_cd(to_tsvector(title), replace(query::text, '&', '|')::tsquery, 32) as rank, 
                 title::tsvector,
                 replace(query::text, '&', '|')::tsquery from a, (select 
                 plainto_tsquery('english', query) as query, id from b) AS  b ORDER BY rank DESC; 
   rank    |          title           |        replace        
-----------+--------------------------+-----------------------
  0.166667 | 'a' 'and' 'cat' 'rat'    | 'rat' | 'cat'
  0.166667 | 'a' 'and' 'cat' 'rat'    | 'rat' | 'fat' | 'cat'
 0.0909091 | 'a' 'or' 'rhino' 'tiger' | 'mous' | 'rhino'
 0.0909091 | 'a' 'and' 'cat' 'rat'    | 'lorem' | 'cat'
 0.0909091 | 'a' 'and' 'cat' 'mouse'  | 'lorem' | 'cat'
 0.0909091 | 'a' 'and' 'cat' 'mouse'  | 'rat' | 'cat'
 0.0909091 | 'a' 'and' 'cat' 'mouse'  | 'mous' | 'rhino'
 0.0909091 | 'a' 'and' 'cat' 'mouse'  | 'rat' | 'fat' | 'cat'
         0 | 'a' 'or' 'rhino' 'tiger' | 'rat' | 'fat' | 'cat'
         0 | 'a' 'and' 'cat' 'rat'    | 'mous' | 'rhino'
         0 | 'a' 'and' 'cat' 'mouse'  | 'lorem' | 'ipsum'
         0 | 'a' 'or' 'rhino' 'tiger' | 'lorem' | 'ipsum'
         0 | 'a' 'or' 'rhino' 'tiger' | 'lorem' | 'cat'
         0 | 'a' 'or' 'rhino' 'tiger' | 'rat' | 'cat'
         0 | 'a' 'and' 'cat' 'rat'    | 'lorem' | 'ipsum'
(15 rows)

也许您可以使用
ts\u rank\u cd()
函数。如第12.3.3节文件所述。排名搜索结果。正如文档中所描述的,这个排名创建了一个normalizationOk,你能给我写一个查询的例子吗?我试过了,但没用。