2017-10-23 3 views
2

나는 ~ 100,000 개의 문자열 (varchar)이 저장되는 A 열을 포함하는 table1을 가지고 있습니다. 불행히도 각 문자열에는 공백으로 구분 된 여러 개의 단어가 있습니다. 또한 그것들은 길이가 다르다. 즉, 한 문자열은 3 단어로 구성 될 수 있고 다른 문자열은 7 단어로 구성 될 수있다.postgresql 비슷한 단어 그룹을 찾으십시오

그런 다음 동일한 방법으로 100 개의 문자열 만 포함하는 두 번째 table2에 저장된 열 B가 있습니다. 따라서 문자열별로 여러 단어가 공백으로 구분됩니다.

목표는 열 B의 레코드가 해당 단어를 기반으로하는 열 A의 여러 레코드와 얼마나 일치하는지 확인하는 것입니다. 결과도 순위가 있어야합니다. 루프에서 전체 텍스트 검색을 사용하려고 생각했지만이 작업을 수행하는 방법을 모르거나이 작업을 수행하는 적절한 방법이 있습니까?

답변

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_matches (공백으로 갈라)된다

그래서 당신은 당신의 답변을

+0

덕분에 ... 순위의 일종을 얻기 위해 3, 4 열을 기준으로 주문할 수 있습니다. 필자가 pgsql을 처음 접했을 때 나는 그것을 이해하지 못하기 때문에. 토큰은 무엇을 의미합니까? –

+0

토큰은 단어입니다.이 경우 단순화를 위해 공백으로 구분 된 문자를 사용했습니다. 개념을 보려면 https://www.postgresql.org/docs/current/static/textsearch-controls.html#textsearch-parsing-documents를 읽으십시오. –

관련 문제