이전 섹션의 예에서는 간단한 상수 문자열을 사용하여 전체 텍스트 일치를 설명했습니다. 이 섹션에서는 선택적으로 색인을 사용하여 테이블 데이터를 검색하는 방법을 보여줍니다.
색인 없이 전체 텍스트 검색이 가능합니다. 를 인쇄하는 간단한 쿼리제목단어가 포함된 각 행친구그 안에몸필드는 다음과 같습니다:
제목 선택
pgweb에서
WHERE to_tsVector('english', body) @@ to_tsquery('english', 'friend');
다음과 같은 관련 단어도 검색됩니다.친구그리고친절한, 이는 모두 동일한 정규화된 어휘로 축소되기 때문입니다.
위 쿼리는 다음을 지정합니다.영어구성은 문자열을 구문 분석하고 정규화하는 데 사용됩니다. 또는 구성 매개변수를 생략할 수도 있습니다.
제목 선택
pgweb에서
어디에서 to_tsVector(body) @@ to_tsquery('friend');
이 쿼리는 다음에 의해 설정된 구성을 사용합니다.default_text_search_config.
더 복잡한 예는 다음을 포함하는 가장 최근 문서 10개를 선택하는 것입니다.생성그리고테이블에서제목또는몸:
제목 선택
pgweb에서
WHERE to_tsVector(title || ' ' || body) @@ to_tsquery('create & table')
ORDER BY last_mod_date DESC
10개 제한;
명확하게 하기 위해 다음을 생략했습니다.합체다음을 포함하는 행을 찾는 데 필요한 함수 호출NULL두 필드 중 하나에.
이러한 쿼리는 색인 없이 작동하지만 대부분의 응용 프로그램은 가끔 임시 검색을 제외하고는 이 접근 방식이 너무 느리다는 것을 알게 될 것입니다. 텍스트 검색을 실제로 사용하려면 일반적으로 색인 생성이 필요합니다.
우리는 만들 수 있습니다진색인(섹션 12.9) 텍스트 검색 속도를 높이기 위해:
GIN을 사용하여 pgweb에서 pgweb_idx 인덱스 생성 (to_tsVector('english', body));
다음의 2인수 버전에 주목하세요.to_tsVector사용됩니다. 표현식 인덱스에서는 구성 이름을 지정하는 텍스트 검색 함수만 사용할 수 있습니다(사설 토토 사이트 : 문서 : 10 : 11.7. 표현에 대한 색인). 이는 인덱스 내용이 다음의 영향을 받지 않아야 하기 때문입니다.default_text_search_config. 영향을 받은 경우 다른 항목에 다음 항목이 포함될 수 있으므로 색인 내용이 일관되지 않을 수 있습니다.ts벡터s는 서로 다른 텍스트 검색 구성으로 생성되었으며 어느 것이 어느 것인지 추측할 방법이 없습니다. 이러한 인덱스를 올바르게 덤프하고 복원하는 것은 불가능합니다.
다음의 두 인수 버전 때문에to_tsVector위 인덱스에서 사용되었으며 2개의 인수 버전을 사용하는 쿼리 참조만 사용되었습니다.to_tsVector동일한 구성 이름을 사용하면 해당 색인을 사용합니다. 즉,어디에서 to_tsVector('english', body) @@ 'a & b'색인을 사용할 수 있지만어디에서 to_tsVector(body) @@ 'a & b'할 수 없습니다. 이렇게 하면 색인 항목을 생성하는 데 사용된 것과 동일한 구성으로만 색인이 사용됩니다.
구성 이름이 다른 열로 지정되는 더 복잡한 표현식 토토 캔를 설정할 수 있습니다. 예:
GIN을 사용하여 pgweb에서 pgweb_idx 인덱스 생성(to_tsVector(config_name, body));
어디에서config_name은의 열입니다.pgweb테이블. 이를 통해 각 인덱스 항목에 사용된 구성을 기록하는 동안 동일한 인덱스에서 혼합 구성이 가능합니다. 예를 들어, 문서 컬렉션에 다른 언어로 된 문서가 포함되어 있는 경우 유용합니다. 다시 말하지만, 인덱스를 사용하려는 쿼리는 다음과 같이 일치하도록 표현되어야 합니다.어디에서 to_tsVector(config_name, body) @@ 'a & b'.
색인은 열을 연결할 수도 있습니다:
GIN을 사용하여 pgweb에서 pgweb_idx 인덱스 생성 (to_tsVector('english', title || ' ' || body));
또 다른 접근 방식은 별도의 계정을 생성하는 것입니다.ts벡터출력을 저장할 열to_ts벡터. 이 예는 다음을 연결한 것입니다.제목그리고몸, 사용합체다른 필드가 색인화될 때 한 필드가 계속 색인화되도록 보장하기 위해NULL:
ALTER TABLE pgweb ADD COLUMN textsearchable_index_col tsVector;
업데이트 pgweb SET textsearchable_index_col =
     to_tsVector('english', coalesce(title,'') || ' ' || coalesce(body,''));
그런 다음 우리는 다음을 만듭니다진검색 속도를 높이는 색인:
GIN(textsearchable_index_col)을 사용하여 pgweb에서 textsearch_idx 인덱스 생성;
이제 빠른 전체 텍스트 검색을 수행할 준비가 되었습니다.
제목 선택
pgweb에서
WHERE textsearchable_index_col @@ to_tsquery('생성 및 테이블')
ORDER BY last_mod_date DESC
10개 제한;
별도의 열을 사용하여 저장하는 경우ts벡터표현을 유지하려면 트리거를 생성해야 합니다.ts벡터언제든지 현재 열제목또는몸변경사항.섹션 12.4.3그 방법을 설명합니다.
식 인덱스에 비해 별도 열 접근 방식의 한 가지 장점은 인덱스를 사용하기 위해 쿼리에서 텍스트 검색 구성을 명시적으로 지정할 필요가 없다는 것입니다. 위의 예에서 볼 수 있듯이 쿼리는 다음에 따라 달라질 수 있습니다.default_text_search_config. 또 다른 장점은 다시 실행할 필요가 없기 때문에 검색이 더 빨라진다는 것입니다.to_tsVector토토 캔 일치를 확인하기 위해 호출합니다. (이것은 GIN 토토 캔보다 GiST 토토 캔를 사용할 때 더 중요합니다. 참조PostgreSQL : 문서 : 10 : 12.9. 텍스트 검색을위한 우선 사설 토토 유형.) 그러나 표현식 인덱스 접근 방식은 설정이 더 간단하고 다음과 같은 방식으로 디스크 공간이 덜 필요합니다.ts벡터표현이 명시적으로 저장되지 않았습니다.