postgresql找到相似的单词组

时间:2017-10-23 23:50:14

标签: postgresql full-text-search string-matching varchar

我有一个包含A列的table1,其中存储了~100,000个字符串(varchar)。不幸的是,每个字符串都有多个单词,这些单词用空格分隔。此外,它们具有不同的长度,即一个字符串可以由3个字组成,而另一个字符串包含7个字。

然后我在第二个table2中存储了一个列B,它以相同的方式只包含100个字符串。因此,每个字符串有多个单词,用空格分隔。

目标是,根据单词,查看B列记录与A列的多个记录匹配的可能性。结果也应该有一个排名。我想在循环中使用全文搜索,但我不知道如何做到这一点,或者是否有正确的方法来实现这一目标?

1 个答案:

答案 0 :(得分:0)

我不知道你能否" tturn"表到字典,使用全文进行排名。但你可以很容易地用一些primityve排名查询它,例如:

t=# with a(a) as (values('a b c'),('a c d'),('b e f'),('r b t'),('q w'))
, b(i,b) as (values(1,'a b'), (2,'e'), (3,'b'))
, p as (select unnest(string_to_array(b.b,' ')) arr,i from b)
select a phrases,arr match_words,count(1) over (partition by arr) words_in_matches, count(1) over (partition by i) matches,i from a left join p on a.a like '%'||arr||'%';
 phrases | match_words | words_in_matches | matches | i
---------+-------------+------------------+---------+---
 r b t   | b           |                6 |       5 | 1
 a b c   | b           |                6 |       5 | 1
 b e f   | b           |                6 |       5 | 1
 a b c   | a           |                2 |       5 | 1
 a c d   | a           |                2 |       5 | 1
 b e f   | e           |                1 |       1 | 2
 r b t   | b           |                6 |       3 | 3
 a b c   | b           |                6 |       3 | 3
 b e f   | b           |                6 |       3 | 3
 q w     |             |                1 |       1 |
(10 rows)
  • 短语是大表中的行。
  • match_words是小桌子上的标记(用空格分割)
  • words_in_匹配短语中的令牌数量
  • 匹配是来自小表短语的大表短语中的匹配数量
  • 我从小表开始的短语索引

所以你可以通过第三或第四列订购以获得某种排名...