2013-06-28 5 views
1

난 그냥 퍼지 텍스트 매칭을 위해 postgreSQL을 사용하기 시작했습니다. 두 개의 열이 있는데, job_titlecompany_name입니다.PostgreSQL을 사용하여 여러 열의 전체 텍스트 검색

일반적인 전체 텍스트 검색은 job_titlecompany_name을 연결 한 다음 단일 순위에 따라 검색 텍스트 결과를 반환합니다.

그러나 두 개의 열에서 텍스트 일치를 동일하게 처리하는 것은 필자의 경우 문제가 될 수 있습니다. 예를 들어, Google Co.에서 Search Engineer 내가 각 열에 대해 서로 다른 가중치를 할당 할 수 있다는 사실을 알고 Engineer Co.

에서 Google Search와 동등하게 평가되어서는 안된다. 그러나, 나는 다른 것보다 하나 더 중요하게 생각하는 이유가 없습니다.

키워드를 각 열과 별도로 일치시키고 각 키워드에 대해 "일치 점수"를 반환하려면 어떻게해야합니까?

뭔가 같은 : 당신이 지적했듯이

Jobs.where("(to_tsvector('english', position) @@ plainto_tsquery(:q)) AND 

(to_tsvector('english',company) @@ plainto_tsquery(:q))", q: "Search Engineer", q: "Google") 

답변

1

, 당신은 tsvectors 연결할 수 있습니다 :

# select to_tsvector('job description') || 
     to_tsvector('company as keyword') || 
     to_tsvector('job description as body') as vector; 
          vector       
----------------------------------------------------------- 
'bodi':9 'compani':3 'descript':2,7 'job':1,6 'keyword':5 
(1 row) 

을 그리고 당신은 또한 그들에게 가중치를 할당 할 수

# select (setweight(to_tsvector('job description'), 'A') || 
     setweight(to_tsvector('company as keyword'), 'B') || 
     setweight(to_tsvector('job description as body'), 'D')) as vector; 
          vector        
--------------------------------------------------------------- 
'bodi':9 'compani':3B 'descript':2A,7 'job':1A,6 'keyword':5B 
(1 row) 

당신은 할 수 있습니다 ts_rank_cd()과 함께 놀아 라. 특히 점수를 정규화하는 방식을 변경할 수 있습니다. 귀하의 경우에는

http://www.postgresql.org/docs/current/static/textsearch-controls.html

는, 당신이 대신 두 개의 쿼리를 결합하려는 것으로 보인다. 추악하지만 적절한 솔루션은 다음과 같이 보일 수 있습니다.

select sum(rank) as rank, ... 
from (
    select ... 
    union all 
    select ... 
    ) as sub 
group by ... 
order by sum(rank) desc 
limit 10 

자세히 알 수 있듯이 매우 좋지 않습니다. 또한 잠재적으로 큰 일치하는 행 세트를 집계하는 대도시이기도합니다. Imho, 내장 된 tsvector 산술을 고수하고 필요한 경우 가중치를 조정하는 것이 좋습니다.

+0

우수 답변을 드린 감사합니다! – AdamNYC

관련 문제