64.4. GIN 지수#

64.4.1. 소개#

stands for Generalized Inverted Index.은 색인을 생성할 항목이 복합 값이고 색인에서 처리할 쿼리가 복합 항목 내에 나타나는 요소 값을 검색해야 하는 경우를 처리하도록 설계되었습니다. 예를 들어 항목은 문서일 수 있고 쿼리는 특정 단어가 포함된 문서 검색일 수 있습니다.

우리는 단어를 사용사설 토토항목인덱싱할 복합 값을 참조하고 단어요소 값을 참조사설 토토.항상 항목 값 자체가 아닌 키를 저장하고 검색합니다.

A 색인은 (키, 게시 목록) 쌍 세트를 저장사설 토토. 여기서 a게시 목록은 키가 발생하는 행 ID 집합입니다. 항목에 키가 두 개 이상 포함될 수 있으므로 동일한 행 ID가 여러 게시 목록에 나타날 수 있습니다. 각 키 값은 한 번만 저장되므로 a동일한 키가 여러 번 나타나는 경우 색인은 매우 간결사설 토토.

다음과 같은 의미로 일반화됩니다.액세스 방법 코드는 가속화되는 특정 작업을 알 필요가 없습니다. 대신 특정 데이터 유형에 대해 정의된 사용자 정의 전략을 사용합니다. 이 전략은 인덱싱된 항목과 쿼리 조건에서 키를 추출하는 방법과 쿼리의 키 값 중 일부가 포함된 행이 실제로 쿼리를 충족하는지 여부를 결정하는 방법을 정의합니다.

한 가지 장점데이터베이스 전문가가 아닌 데이터 유형 분야의 전문가가 적절한 액세스 방법을 사용하여 사용자 정의 데이터 유형을 개발할 수 있다는 것입니다. 이는 다음을 사용하는 것과 거의 동일한 이점입니다.지스트.

구현PostgreSQL주로 Teodor Sigaev와 Oleg Bartunov가 관리합니다. 다음에 대한 추가 정보가 있습니다.그들의웹사이트.

64.4.2. 내장 연산자 클래스#

핵심포스트그레SQL배포에는 다음이 포함됩니다.다음에 표시된 연산자 클래스표 64.3. (다음에 설명된 일부 선택적 모듈PostgreSQL : 문서 : 17 : 부록 F. 추가 제공된 모듈 및 스포츠 토토 사이트추가 제공연산자 클래스.)

표 64.3. 내장연산자 클래스

이름 인덱싱 가능한 연산자
array_ops &&(모든 배열,모든 배열)
@ (anyarray,anyarray)
<@ (anyarray,anyarray)
= (anyarray,anyarray)
jsonb_ops @ (jsonb,jsonb)
@? (jsonb,jsonpath)
@@ (jsonb,jsonpath)
? (jsonb,텍스트)
?| (jsonb,텍스트[])
?& (jsonb,text[])
jsonb_path_ops @ (jsonb,jsonb)
@? (jsonb,jsonpath)
@@ (jsonb,jsonpath)
tsVector_ops @@ (tsVector,tsquery)

유형에 대한 두 연산자 클래스 중jsonb, jsonb_ops기본값입니다.jsonb_path_ops지원하는 연산자는 적지만 해당 연산자에 대해 더 나은 성능을 제공합니다. 참조섹션 8.14.4자세한 내용은.

64.4.3. 확장성#

인터페이스는 추상화 수준이 높기 때문에 액세스 방법 구현자가 액세스되는 데이터 유형의 의미 체계만 구현하면 됩니다.계층 자체가 동시성, 로깅 및 트리 구조 검색을 관리사설 토토.

을 얻기 위해 필요한 모든 것액세스 방법 작동은 트리의 키 동작과 키, 색인된 항목 및 색인 가능한 쿼리 간의 관계를 정의하는 몇 가지 사용자 정의 방법을 구현하는 것입니다. 한마디로,확장성과 일반성, 코드 재사용 및 깔끔한 인터페이스를 결합사설 토토.

연산자 클래스에는 두 가지 메소드가 있습니다.다음을 제공해야 합니다.

데이텀 *extractValue(데이텀 itemValue, int32 *nkeys, bool **nullFlags)

Returns a palloc'd array of keys given an item to be indexed. 반환된 키의 수는 다음 위치에 저장되어야 합니다.*nkeys. 키 중 하나라도 null이 될 수 있으면 다음 배열도 palloc에 추가합니다.*nkeys 부울필드, 주소를 다음 위치에 저장하세요.*nullFlags, 필요에 따라 이러한 null 플래그를 설정사설 토토.*nullFlags남길 수 있음NULL18017_18090NULL항목에 열쇠가 포함되어 있지 않은 경우.

데이텀 *extractQuery(데이텀 쿼리, int32 *nkeys, StrategyNumber n, bool **pmat사설 토토, 포인터 **extra_data, bool **nullFlags, int32 *searchMode)

쿼리할 값이 주어지면 palloc'd 키 배열을 반환사설 토토. 즉,질의왼쪽이 인덱싱된 열인 인덱싱 가능한 연산자의 오른쪽 값입니다.n은 연산자 클래스 내 연산자의 전략 번호입니다(참조섹션 36.16.2). 종종,추출쿼리상담이 필요사설 토토n데이터 유형을 결정하기 위해질의및 키 값을 추출하는 데 사용해야 하는 방법입니다. 반환된 키의 수는 다음 위치에 저장되어야 합니다.*nkeys. 키 중 하나라도 null이 될 수 있는 경우, 또한 다음 배열을 palloc으로 지정합니다.*nkeys 부울필드, 해당 주소를에 저장하세요.*nullFlags, 필요에 따라 이러한 null 플래그를 설정사설 토토.*nullFlags남길 수 있음NULL19462_19535NULLif the질의키가 포함되어 있지 않습니다.

검색모드는 다음을 허용하는 출력 인수입니다.추출쿼리검색 수행 방법에 대한 세부정보를 지정합니다. 만일*검색모드다음으로 설정됨GIN_SEAR사설 토토_MODE_DEFAULT(호출 전에 초기화되는 값), 반환된 키 중 적어도 하나와 일치하는 항목만 후보 일치로 간주됩니다. 만일*검색모드다음으로 설정됨GIN_SEAR사설 토토_MODE_INCLUDE_EMPTY, 그러면 일치하는 키가 하나 이상 포함된 항목 외에도 키가 전혀 포함되지 않은 항목도 후보 일치로 간주됩니다. (이 모드는 예를 들어 is-subset-of 연산자를 구현하는 데 유용합니다.) If*검색모드다음으로 설정됨GIN_SEAR사설 토토_MODE_ALL, 반환된 키와 일치하는지 여부에 관계없이 인덱스의 null이 아닌 모든 항목은 후보 일치로 간주됩니다. (이 모드는 본질적으로 전체 인덱스를 스캔해야 하기 때문에 다른 두 가지 선택보다 훨씬 느립니다. 그러나 코너 케이스를 올바르게 구현해야 할 수도 있습니다. 대부분의 경우 이 모드가 필요한 연산자는 아마도 GIN 연산자 클래스에 적합한 후보가 아닐 것입니다.) 이 모드를 설정하는 데 사용할 기호는 다음에 정의되어 있습니다.액세스/gin.h.

pmat사설 토토은 부분 일치가 지원될 때 사용되는 출력 인수입니다. 그것을 사용하려면,추출쿼리다음 배열을 할당해야 사설 토토*nkeys 부울s 그리고 주소를에 저장하세요.*pmat사설 토토. 해당 키에 부분 일치가 필요한 경우 배열의 각 요소를 true로 설정하고, 그렇지 않은 경우 false로 설정해야 사설 토토. 만일*pmat사설 토토다음으로 설정됨NULL그러면 GIN은 부분 일치가 필요하지 않다고 가정합니다. 변수는 다음과 같이 초기화됩니다.NULL호출하기 전에, 부분 일치를 지원하지 않는 연산자 클래스에서는 이 인수를 무시할 수 있습니다.

extra_data다음을 허용하는 출력 인수입니다.추출쿼리추가 데이터를 다음에 전달하기 위해일관됨그리고비교부분방법. 그것을 사용하려면,추출쿼리배열을 할당해야 사설 토토*nkeys포인터를 사용하고 주소를 다음 위치에 저장합니다.*extra_data, 그런 다음 원하는 것을 개별 포인터에 저장합니다. 변수는 다음과 같이 초기화됩니다.NULL호출하기 전에 추가 데이터가 필요하지 않은 연산자 클래스에서는 이 인수를 무시할 수 있습니다. 만일*extra_data이 설정되면 전체 배열이일관적인메서드 및 해당 요소비교부분방법.

연산자 클래스는 색인된 항목이 쿼리와 일치하는지 확인하는 함수도 제공해야 합니다. 부울의 두 가지 맛이 있습니다.일관적인함수 및 삼항트리일관성함수.트리일관성두 가지 기능을 모두 다루므로 다음을 제공합니다.트리일관성하나만으로도 충분합니다. 그러나 부울 변형이 계산 비용이 훨씬 저렴하다면 두 가지를 모두 제공하는 것이 유리할 수 있습니다. 부울 변형만 제공되는 경우 모든 키를 가져오기 전에 색인 항목을 반박하는 데 의존하는 일부 최적화가 비활성화됩니다.

bool 일관된(bool check[], StrategyNumber n, Datum query, int32 nkeys, Pointer extra_data[], bool *recheck, Datum queryKeys[], bool nullFlags[])

색인된 항목이 쿼리 연산자의 전략 번호를 만족하면 참을 반환합니다.n(또는 재확인 표시가 반환되면 이를 만족할 수도 있음). 이 함수는 인덱싱된 항목의 값에 직접 액세스할 수 없습니다.항목을 명시적으로 저장하지 않습니다. 오히려 쿼리에서 추출된 키 값이 특정 인덱싱된 항목에 나타나는지에 대한 정보가 이용 가능합니다.확인배열에 길이가 있음n키, 이는 이전에에서 반환된 키 수와 동일합니다.추출쿼리이것을 위해질의데이텀. 의 각 요소확인배열은 색인된 항목에 해당 쿼리 키가 포함된 경우 참입니다. 즉, (check[i] == true) i번째 키가추출쿼리결과 배열이 색인된 항목에 있습니다. 원본질의다음의 경우 데이터가 전달됩니다.일관적인방법은 이를 참조해야 하며, 그도 마찬가지입니다쿼리키[]그리고nullFlags[]이전에 반환한 배열추출쿼리. extra_datais the extra-data array returned by추출쿼리또는NULL없으면.

언제추출쿼리null 키를 반환사설 토토.쿼리키[], 해당확인[]element is true if the indexed item contains a null key; 즉, 의미론은확인[]같습니다다음과 다르지 않습니다.일관됨함수는 해당하는 것을 검사할 수 있습니다nullFlags[]일반 값 일치와 null 일치 간의 차이를 알려야 하는 경우 요소입니다.

성공하면,*다시 확인힙 튜플을 쿼리 연산자에 대해 다시 확인해야 하는 경우 true로 설정해야 하고, 인덱스 테스트가 정확하면 false로 설정해야 합니다. 즉, 잘못된 반환 값은 힙 튜플이 쿼리와 일치하지 않음을 보장합니다. 를 사용한 실제 반환 값*다시 확인false로 설정하면 힙 튜플이 쿼리와 일치함을 보장합니다. 그리고 다음의 실제 반환 값은*다시 확인true로 설정하면 힙 튜플이 쿼리와 일치할 수 있으므로 원래 인덱싱된 항목에 대해 쿼리 연산자를 직접 평가하여 가져오고 다시 확인해야 함을 의미합니다.

GinTernaryValue triConcious(GinTernaryValue check[], StrategyNumber n, Datum query, int32 nkeys, Pointer extra_data[], Datum queryKeys[], bool nullFlags[])

트리일관성다음과 유사함일관적인, 그러나의 부울 대신확인벡터, 각 키에 대해 세 가지 가능한 값이 있습니다:GIN_TRUE, GIN_FALSE그리고GIN_MAYBE. GIN_FALSE그리고GIN_TRUE일반 부울 값과 동일한 의미를 갖는 반면GIN_MAYBE은 해당 키의 존재를 알 수 없음을 의미합니다. 언제GIN_MAYBE값이 존재사설 토토. 함수는 반환만 해야 사설 토토.GIN_TRUE인덱스 항목에 해당 쿼리 키가 포함되어 있는지 여부와 항목이 확실히 일치하는 경우. 마찬가지로 함수는 다음을 반환해야 합니다.GIN_FALSE항목이 확실히 일치하지 않는 경우에만 해당 항목의 포함 여부에 관계없이GIN_MAYBE키. 결과가 다음에 따라 달라지는 경우GIN_MAYBE항목, 즉 알려진 쿼리 키를 기반으로 일치를 확인하거나 반박할 수 없으며 함수는 반환해야 합니다.GIN_MAYBE.

없을 때GIN_MAYBE확인벡터, aGIN_MAYBE반환 값은 다음을 설정하는 것과 동일합니다.다시 확인부울 플래그일관적인함수.

또한 GIN에는 색인에 저장된 키 값을 정렬하는 방법이 있어야 합니다. 연산자 클래스는 비교 방법을 지정하여 정렬 순서를 정의할 수 있습니다.

int 비교(데이텀 a, 데이텀 b)

두 개의 키(인덱싱된 항목 아님!)를 비교하고 0보다 작은 정수, 0 또는 0보다 큰 정수를 반환하여 첫 번째 키가 두 번째 키보다 작거나 같은지 또는 큰지를 나타냅니다. Null 키는 이 함수에 전달되지 않습니다.

또는 연산자 클래스가 다음을 제공하지 않는 경우비교메소드를 사용하면 GIN은 인덱스 키 데이터 유형에 대한 기본 btree 연산자 클래스를 조회하고 해당 비교 기능을 사용합니다. btree 연산자 클래스를 찾는 데 몇 사이클이 걸리기 때문에 단 하나의 데이터 유형만을 의미하는 GIN 연산자 클래스에 비교 함수를 지정하는 것이 좋습니다. 그러나 다형성 GIN 연산자 클래스(예:array_ops) typically cannot specify a single comparison function.

다음에 대한 연산자 클래스선택적으로 다음 메소드를 제공할 수 있습니다:

int ComparePartial(데이텀 부분 키, 데이텀 키, 전략 번호 n, 포인터 extra_data)

부분 일치 쿼리 키를 인덱스 키와 비교하십시오. 결과를 나타내는 부호가 있는 정수를 반환합니다. 0보다 작으면 인덱스 키가 쿼리와 일치하지 않지만 인덱스 스캔은 계속되어야 함을 의미합니다. 0은 인덱스 키가 쿼리와 일치함을 의미합니다. 0보다 크면 더 이상 일치하는 항목이 없기 때문에 인덱스 스캔이 중지되어야 함을 나타냅니다. 전략 번호n30141_30286extra_data는 다음에 의해 만들어진 추가 데이터 배열의 해당 요소입니다.추출쿼리, 또는NULL없으면. Null 키는 이 함수에 전달되지 않습니다.

void 옵션(local_relopts *relopts)

연산자 클래스 동작을 제어하는 사용자가 볼 수 있는 매개변수 세트를 정의합니다.

옵션함수는 a에 대한 포인터를 전달받습니다.local_reloptsstruct, 연산자 클래스별 옵션 세트로 채워져야 합니다. 옵션은를 사용하여 다른 지원 기능에서 액세스할 수 있습니다.PG_HAS_OPCLASS_OPTIONS()그리고PG_GET_OPCLASS_OPTIONS()매크로.

인덱싱된 값의 키 추출과 키의 표현이 모두 포함되어 있으므로유연하며 사용자가 지정한 매개변수에 따라 달라질 수 있습니다.

지원하기 위해부분 일치쿼리, 연산자 클래스는 다음을 제공해야 합니다.비교부분방법 및 해당추출쿼리메서드는 다음을 설정해야 합니다.pmat사설 토토부분 일치 쿼리가 발견될 때의 매개변수입니다. 참조섹션 64.4.4.2자세한 내용은.

다양한 실제 데이터 유형데이텀위에 언급된 값은 연산자 클래스에 따라 다릅니다. 전달된 항목 값추출값항상 연산자 클래스의 입력 유형이고 모든 키 값은 클래스의 입력 유형이어야 합니다.저장유형. 의 유형질의인수 전달됨추출쿼리, 일관됨그리고트리일관성은 전략 번호로 식별되는 클래스 멤버 연산자의 오른쪽 입력 유형입니다. 올바른 유형의 키 값을 추출할 수 있는 한 색인화된 유형과 동일할 필요는 없습니다. 그러나 이 세 가지 지원 함수의 SQL 선언에서는 opclass의 인덱스 데이터 유형을 사용하는 것이 좋습니다.질의인수(실제 유형은 연산자에 따라 다를 수 있음).

64.4.4. 구현#

내부적으로, a인덱스에는 키에 대해 구성된 B-트리 인덱스가 포함되어 있습니다. 여기서 각 키는 하나 이상의 인덱스 항목(예: 배열의 멤버)의 요소이고 리프 페이지의 각 튜플에는 힙 포인터의 B-트리에 대한 포인터(a게시 트리) 또는 간단한 힙 포인터 목록(a게시 목록) 목록이 키 값과 함께 단일 인덱스 튜플에 들어갈 만큼 작은 경우.그림 64.1GIN 색인의 이러한 구성요소를 설명사설 토토.

현재PostgreSQL9.1, null 키 값이 인덱스에 포함될 수 있습니다. 또한 자리 표시자 Null은 다음에 따라 null이거나 키를 포함하지 않는 색인 생성된 항목의 색인에 포함됩니다.추출값. 이를 통해 빈 항목을 찾아야 하는 검색이 가능해집니다.

다중 열색인은 복합 값(열 번호, 키 값)에 대해 단일 B-트리를 구축하여 구현됩니다. 다양한 열의 키 값은 다양한 유형일 수 있습니다.

그림 64.1. 진 내부


64.4.4.1. GIN 빠른 업데이트 기술#

업데이트 중인덱스는 반전된 인덱스의 본질적인 특성으로 인해 느린 경향이 있습니다. 하나의 힙 행을 삽입하거나 업데이트하면 인덱스에 많은 삽입이 발생할 수 있습니다(인덱싱된 항목에서 추출된 각 키에 대해 하나씩).은 보류 중인 항목의 정렬되지 않은 임시 목록에 새 튜플을 삽입하여 이 작업의 대부분을 연기할 수 있습니다. 테이블을 진공청소하거나 자동 분석할 때 또는 때gin_clean_pending_list함수가 호출되거나 보류 목록이 다음보다 커지는 경우gin_pending_list_limit, 항목이 기본으로 이동됩니다.초기 색인 생성 중에 사용된 것과 동일한 대량 삽입 기술을 사용하는 데이터 구조입니다. 이로 인해 크게 개선되었습니다.색인 업데이트 속도, 추가 진공 오버헤드까지 계산. 또한 오버헤드 작업은 포그라운드 쿼리 처리 대신 백그라운드 프로세스로 수행될 수 있습니다.

이 접근 방식의 가장 큰 단점은 검색이 일반 색인 검색 외에도 보류 항목 목록을 검색해야 하므로 보류 항목 목록이 많으면 검색 속도가 상당히 느려진다는 것입니다. 또 다른 단점은 대부분의 업데이트가 빠르지만 보류 목록이 발생하는 업데이트입니다.너무 큼즉시 정리 주기가 발생하므로 다른 업데이트보다 훨씬 느립니다. Autovacuum을 적절하게 사용하면 이러한 문제를 모두 최소화할 수 있습니다.

업데이트 속도보다 일관된 응답 시간이 더 중요한 경우, 보류 항목 사용을 꺼서 비활성화할 수 있습니다.빠른 업데이트a에 대한 저장 매개변수색인. 참조색인 생성자세한 내용은.

64.4.4.2. 부분 일치 알고리즘#

GIN이 지원할 수 있습니다부분 일치쿼리는 하나 이상의 키에 대한 정확한 일치를 결정하지 않지만 가능한 일치는 합리적으로 좁은 범위의 키 값(에 의해 결정된 키 정렬 순서 내에서)에 속하는 쿼리입니다.비교지원 방법).추출쿼리메소드는 정확히 일치할 키 값을 반환하는 대신 검색할 범위의 하한인 키 값을 반환하고 다음을 설정합니다.pmat사설 토토플래그가 참입니다. 그런 다음 키 범위는를 사용하여 스캔됩니다.비교부분방법.비교부분일치하는 인덱스 키에 대해서는 0을 반환해야 하고, 검색할 범위 내에 있는 불일치에 대해서는 0보다 작은 값을 반환해야 하며, 인덱스 키가 일치할 수 있는 범위를 벗어나면 0보다 큰 값을 반환해야 사설 토토.

64.4.5. GIN 팁과 요령#

생성 및 삽입

a에 삽입각 항목에 대해 많은 키가 삽입될 가능성으로 인해 색인이 느려질 수 있습니다. 따라서 테이블에 대량 삽입하려면 GIN 인덱스를 삭제하고 대량 삽입을 마친 후 다시 생성하는 것이 좋습니다.

언제빠른 업데이트다음에 대해 활성화되었습니다.(참조섹션 64.4.4.1자세한 내용은) 그렇지 않은 경우보다 페널티가 적습니다. 그러나 대규모 업데이트의 경우에는 색인을 삭제하고 다시 생성하는 것이 여전히 가장 좋습니다.

maintenance_work_mem

a의 빌드 시간색인은 다음에 매우 민감합니다.maintenance_work_mem설정; 인덱스 생성 중에 작업 메모리를 인색하는 것은 비용이 들지 않습니다.

gin_pending_list_limit

기존 항목에 일련의 삽입 중다음을 가진 색인빠른 업데이트활성화되면 시스템은 목록이 다음보다 커질 때마다 보류 항목 목록을 정리합니다.gin_pending_list_limit. 관찰된 응답 시간의 변동을 방지하려면 보류 목록 정리가 백그라운드에서(즉, autovacuum을 통해) 발생하도록 하는 것이 바람직사설 토토. 증가하면 전경 정리 작업을 피할 수 있습니다.gin_pending_list_limit또는 autovacuum을 더욱 공격적으로 만듭니다. 그러나 정리 작업의 임계값을 늘리면 전경 정리가 발생하면 시간이 더 오래 걸립니다.

gin_pending_list_limit저장 매개변수를 변경하여 개별 GIN 인덱스에 대해 재정의할 수 있으며, 이를 통해 각 GIN 인덱스는 자체 정리 임계값을 가질 수 있습니다. 예를 들어, 크게 업데이트될 수 있는 GIN 인덱스에 대해서만 임계값을 늘리고 그렇지 않은 경우에는 임계값을 줄이는 것이 가능합니다.

gin_fuzzy_sear사설 토토_limit

개발의 주요 목표indexes was to create support for highly scalable full-text sear사설 토토 in포스트그레SQL, 전체 텍스트 검색에서 매우 많은 양의 결과가 반환되는 경우가 종종 있습니다. 더욱이 이는 쿼리에 매우 자주 사용되는 단어가 포함되어 있어 큰 결과 집합이 유용하지 않을 때 자주 발생사설 토토. 디스크에서 많은 튜플을 읽고 정렬하는 데 많은 시간이 걸릴 수 있으므로 이는 프로덕션에서는 허용되지 않습니다. (인덱스 검색 자체는 매우 빠릅니다.)

그러한 쿼리의 제어된 실행을 용이하게 하기 위해,반환된 행 수에 대해 구성 가능한 소프트 상한이 있습니다.gin_fuzzy_sear사설 토토_limit구성 매개변수. 기본적으로 0(제한 없음을 의미)으로 설정됩니다. If a non-zero limit is set, then the returned set is a subset of the whole result set, 사설 토토osen at random.

소프트반환된 결과의 실제 개수는 쿼리 및 시스템 난수 생성기의 품질에 따라 지정된 제한과 다소 다를 수 있음을 의미사설 토토.

경험상 수천 단위의 값(예: 5000 - 20000)이 잘 작동사설 토토.

64.4.6. 제한 사항#

인덱싱 가능한 연산자가 엄격하다고 가정합니다. 이는 다음을 의미합니다.추출값null 항목 값에서는 전혀 호출되지 않습니다(대신 자리 표시자 색인 항목이 자동으로 생성됨).추출쿼리NULL 쿼리 값에 대해서도 호출되지 않습니다(대신 쿼리가 만족스럽지 못한 것으로 추정됩니다). 그러나 null이 아닌 복합 항목 또는 쿼리 값 내에 포함된 null 키 값은 지원됩니다.

64.4.7. 예#

핵심PostgreSQL배포에는 다음이 포함됩니다이전에 표시된 연산자 클래스표 64.3. 다음기여모듈에는 다음도 포함됨연산자 클래스:

btree_gin

여러 데이터 유형에 대한 B-트리 동등한 기능

h스토어

(키, 값) 쌍을 저장하기 위한 모듈

인타레이

향상된 지원정수[]

pg_trgm

트라이그램 일치를 사용한 텍스트 유사성

수정사항 제출

문서에 올바르지 않은 내용이 있으면 일치하지 않습니다. 특정 기능에 대한 경험이 있거나 추가 설명이 필요한 경우 이용해주세요이 양식문서 문제를 보고합니다.