이전 섹션의 예에서는 간단한 상수 문자열을 사용한 전체 텍스트 일치를 설명했습니다. 이 섹션에서는 선택적으로 색인을 사용하여 테이블 데이터를 검색하는 방법을 보여줍니다.
색인 없이 전체 텍스트 검색이 가능합니다. 를 인쇄하는 간단한 쿼리제목단어가 포함된 각 행친구그 안에몸필드는 다음과 같습니다:
제목 선택
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이 사용됩니다. 표현식 인덱스에서는 구성 이름을 지정하는 텍스트 검색 함수만 사용할 수 있습니다(PostgreSQL : 문서 : 17 : 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_tsVector. 이 열을 소스 데이터와 자동으로 최신 상태로 유지하려면 저장된 생성 열을 사용하세요. 이 예는 다음을 연결한 것입니다.제목그리고몸, 사용합체다른 필드가 색인화되어 있을 때 한 필드가 계속 색인화되도록 보장하기 위해NULL:
ALTER TABLE pgweb
열 추가 textsearchable_index_col tsVector
항상 생성됨 (to_tsVector('english', coalesce(title, '') || ' ' || coalesce(body, ''))) STORED;
그런 다음 우리는 다음을 만듭니다진검색 속도를 높이는 색인:
GIN(textsearchable_index_col)을 사용하여 pgweb에서 textsearch_idx 인덱스 생성;
이제 빠른 전체 텍스트 검색을 수행할 준비가 되었습니다.
제목 선택
pgweb에서
WHERE textsearchable_index_col @@ to_tsquery('생성 및 테이블')
ORDER BY last_mod_date DESC
10개 제한;
식 인덱스에 비해 별도 열 접근 방식의 한 가지 장점은 인덱스를 사용하기 위해 쿼리에서 텍스트 검색 구성을 명시적으로 지정할 필요가 없다는 것입니다. 위의 예에서 볼 수 있듯이 쿼리는 다음에 따라 달라질 수 있습니다.default_text_search_config. 또 다른 장점은 다시 실행할 필요가 없기 때문에 검색이 더 빨라진다는 것입니다.to_tsVector토토 결과 일치를 확인하기 위한 호출입니다. (이것은 GIN 토토 결과보다 GiST 토토 결과를 사용할 때 더 중요합니다. 참조섹션 12.9.) 그러나 표현식 인덱스 접근 방식은 설정이 더 간단하고 다음과 같은 방식으로 디스크 공간이 덜 필요합니다.ts벡터표현이 명시적으로 저장되지 않았습니다.
문서에 올바르지 않은 내용이 있으면 일치하지 않습니다. 특정 기능에 대한 경험이 있거나 추가 설명이 필요한 경우 이용해주세요이 양식문서 문제를 보고합니다.