2009-09-28 4 views
12

의는 다음과 같이 포스트 그레스 8.3 테이블이 있다고 가정 해 봅시다 :전체 텍스트 색인을 이용하는 포스트그레스에서 어구 기반 전체 텍스트 검색은 어떻게합니까?

CREATE TABLE t1 (body text, body_vector tsvector);

내가 전체 텍스트 인덱스 (GIST, 진 또는 tsvector 열에 모두)를 사용하여 문구를 검색 할 수 있어야합니다. 가장 좋은 해결 방법은 두 단어 (부울 AND)에 대한 전체 텍스트 검색을 먼저 수행 한 다음 구문에 대한 본문 비교를 수행하는 것입니다. 물론 이것은 포스트 그레스의 전체 텍스트 검색이 당신을 위해하는 모든 형태소 분석이나 맞춤법 검사를 포착하지 못합니다. 나는 문구 'W1의 W2'찾고 있어요 경우이의 예는, 내가 사용하십시오 :

SELECT * FROM t1 WHERE body_vector @@ 'w1 & w2'::tsquery AND body LIKE 'w1 w2';

은 당신이 검색에 의지하지 않는 경우이 작업을 수행 할 수있는 방법이 있나요 텍스트 열?

답변

11

정확히 일치하는 구문 검색을 원하면 그 방법입니다. WHERE body_vector @@ plainto_tsquery ('w1 w2')를 시도한 다음 순위에 따라 순서를 지정할 수도 있습니다.

4

업데이트 (요점은 단어가 서로 바로 옆에있는 안타가 상단에 종료해야한다는 것) :

: PostgreSQL의 9.6 텍스트 검색은 구문
select 
    * 
from (values 
    ('i heart new york'), 
    ('i hate york new') 
) docs(body) 
where 
    to_tsvector(body) @@ phraseto_tsquery('new york') 

(1 row retrieved) 

또는 단어 사이의 거리에 의해 지원
-- a distance of exactly 2 "hops" between "quick" and "fox" 
select 
    * 
from (values 
    ('the quick brown fox'), 
    ('quick brown cute fox') 
) docs(body) 
where 
    to_tsvector(body) @@ to_tsquery('quick <2> fox') 

(1 row retrieved) 
+1

어쩌면 나는 뭔가를 포착하지는 못했지만 입력 된 문자열에 작은 따옴표 사이에 검색된 구가 포함될 필요가 없습니까? 문구가 사용자 입력에서 왔을 때, 그리고 문서가 데이터베이스 열에서 온다면, 어떻게 그것을 일반적으로 사용할 수 있습니까? –

+1

이것은 여전히 ​​"구문 검색"이 아닙니다. 그것은 당신의 tsvector 문구 'new york'가 작은 따옴표로 싸여 있기 때문에 작동합니다. – soyayix

+0

예 두 함수는 모두 그렇습니다. 그러나 대부분의 경우 tsvector 문자열에 작은 따옴표가 없습니다. 그렇다면 검색 구문은 무엇입니까? 저는 postgreSQL 9.4와 쿼리가 작동합니다. 9.6에 특정. 선택 'i heart 뉴욕 시티':: tsvector @@ 'new':: tsquery, --true 'i heart 뉴욕 시티':: tsvector @@ 'new & york':: tsquery, - true 'i heart york city':: tsvector @@ '' 'new york' ':: tsquery --false – soyayix