2015-01-08 4 views
2

레일즈 애플리케이션에 pg_search을 구현하려고합니다. 검색 쿼리와 일치하는 열을 얻을 수있는 방법이 있는지 궁금하십니까? 인덱스 테이블 내용은 검색 가능한 모든 열 필드로 구성됩니다.검색어와 일치하는 열을 가져 오는 방법은 무엇입니까?

는 예컨대 :

+-----------+----------+ 
| Firstname | Lastname | 
+-----------+----------+ 
| John  | Doe  | 
| Jane  | Doe  | 
+-----------+----------+ 

가 발생합니다 :

+----------+ 
| Content | 
+----------+ 
| John Doe | 
| Jane Doe | 
+----------+ 

그리고 내 검색 쿼리가 FIRSTNAME 또는 LASTNAME 일치하는 경우 지금은 모르겠어요. pg_search에게 내용 제목에 열 제목을 추가한다고 말할 수있는 옵션이 있습니까? 다음과 같음 :

+------------------------------------------+ 
|     Content     | 
+------------------------------------------+ 
| {"firstname": "John", "Lastname": "Doe"} | 
| {"firstname": "Jane", "Lastname": "Doe"} | 
+------------------------------------------+ 

또는 내 필요에 맞는 검색 방법이 있습니까? pg_search은 특히 내 멀티 테넌트/포스트 그레스 스키마 아키텍처 때문에 잘 작동합니다.

답변

0

둥지 솔루션은 .. 일치하는 행의 각 열에 대한 즉시 tsvectors + 쿼리를 생성하는 아마

예 :

select *, 
(to_tsvector(p.first_name)@@ to_tsquery('joe:*')) found_in_first_name, 
(to_tsvector(p.last_name)@@ to_tsquery('joe:*')) found_in_last_name 
from people p 
where p.fts @@ to_tsquery('joe:*'); 

이 예는 어느 정도에 따라 가능성이 최선의 해결책이다 각 결과에 복귀 할 것으로 예상하고 데이터는 또 다른 당신이 원하는 것 무엇을 얻을 "무게"를 해킹하는 것입니다

을 설정

UPDATE people SET fts = 
    setweight(to_tsvector(coalesce(firstname,'')), 'A') || 
    setweight(to_tsvector(coalesce(lastname,'')), 'B'); 

그래서 우리가 한 것은 firstname 열에 "A"의 "weight"를, tsvector에 "lastname"열에 "B"의 "weight"를 부여하는 것입니다. "A", "B", "C"및 "D"는 유일한 유효 가중치이므로 4 열 이상으로이 작업을 수행해야하는 경우 작동하지 않습니다.

+0

필요한 경우

쿼리는 특정 무게를 조회 할 수 있으며, 무게는 tsvector의 텍스트 표현에서 볼 수 있습니다 검색 할 때 그러나 그들이 (IE를 검색 용어에서 발견 된 무게 반환)을 사용할 수 없습니다 감사! 하지만 tsvector 코드를 어디에 둘 것인지 이해할 수 없습니다. 코드 자체를 이해할 수는 없으므로 문서를 살펴 봐야합니다. 그러나 여러 검색을해도 작동합니까? 40 개의 결과가있는 경우 모델이 같더라도 각 행에 대해 select 쿼리를 실행해야합니까? 그것은 성능 살인자가 아닐까요? 내가 4 개 이상의 컬럼을 사용하고 있기 때문에 대안 2는 나에게 효과가 없을 것이다. 가장 좋은 방법은 콘텐츠 테이블에 JSON을 저장하는 것입니다 (Postgres 9.4부터는 JSONB를 사용하여 완료 할 수 있음). – Slevin

+0

"다중 검색"이란 무엇입니까? 첫 번째 예제는 사용자가 묻는 것 인 경우 여러 용어로 작동합니다. 검색이 실행될 때이 코드가 모델에 포함되어야하며 이미 실행 된 기본 선택 문의 내용에 추가되어야합니다. 별도의 select 문이 아닙니다. –

관련 문제