Postgresql 两个ts向量列之间的ts_秩
我在两个表中有两列,我想选择前20%最相关的术语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
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,你能给我写一个查询的例子吗?我试过了,但没用。