이 문서는 지원되지 않는 PostgreSQL 버전에 대한 것입니다.
당신은 다음과 같은 페이지를 보고 싶을 수도 있습니다.PostgreSQL : 문서 : 17 : F.16. Fuzzystrmatch - 토토 캔 유사성 및 거리 결정버전 또는 위에 나열된 다른 지원 버전 중 하나를 사용하세요.

F.16. fuzzystrmatch — 사설 토토 유사성과 거리를 결정합니다.#

fuzzystrmatch모듈은 사설 토토 간의 유사성과 거리를 결정하는 여러 함수를 제공합니다.

주의

현재,사운덱스, 메타폰, d메타폰dmetaphone_alt함수는 멀티바이트 인코딩(예: utf-8)에서는 제대로 작동하지 않습니다. 사용daitch_mokotoff또는levenshtein그러한 데이터로.

이 모듈은 고려됩니다.신뢰할 수 있는, 즉, 슈퍼유저가 아닌 사용자가 설치할 수 있습니다.생성현재 데이터베이스에 대한 권한입니다.

F.16.1. 사운드덱스#

Soundex 시스템은 비슷한 소리의 이름을 동일한 코드로 변환하여 일치시키는 방법입니다. 이 이름은 1880년, 1900년, 1910년에 미국 인구 조사에서 처음 사용되었습니다. Soundex는 영어가 아닌 이름에는 별로 유용하지 않습니다.

fuzzystrmatch모듈은 Soundex 코드 작업을 위한 두 가지 기능을 제공합니다.

soundex(text)는 텍스트를 반환합니다.
차이(텍스트, 텍스트)는 int를 반환합니다.

사운덱스함수는 사설 토토을 Soundex 코드로 변환합니다.차이함수는 두 문자열을 Soundex 코드로 변환한 다음 일치하는 코드 위치 수를 보고합니다. Soundex 코드에는 4개의 문자가 있으므로 결과 범위는 0에서 4까지이며 0은 일치하지 않고 4는 정확히 일치합니다. (따라서 함수 이름이 잘못되었습니다 —유사성더 나은 이름이었을 것입니다.)

다음은 몇 가지 사용 예입니다:

SELECT soundex('안녕하세요!');

SELECT soundex('앤'), soundex('앤'), Difference('앤', '앤');
SELECT soundex('앤'), soundex('앤드류'), Difference('앤', '앤드류');
SELECT soundex('앤'), soundex('마가렛'), 차이('앤', '마가렛');

CREATE TABLE s(nm 텍스트);

INSERT INTO s VALUES('존');
INSERT INTO s VALUES('조앤');
INSERT INTO s VALUES ('흔들림');
INSERT INTO s VALUES('잭');

SELECT * FROM s WHERE soundex(nm) = soundex('john');

SELECT * FROM s WHERE 차이(s.nm, 'john')  2;

F.16.2. 다이치-모코토프 사운덱스#

원래 Soundex 시스템과 마찬가지로 Daitch-Mokotoff Soundex는 유사한 이름을 동일한 코드로 변환하여 일치시킵니다. 그러나 Daitch-Mokotoff Soundex는 원래 시스템보다 영어가 아닌 이름에 훨씬 더 유용합니다. 원래 시스템에 비해 주요 개선 사항은 다음과 같습니다.

  • 코드는 4개가 아닌 처음 6개의 의미 있는 사설 토토를 기반으로 합니다.

  • 문자 또는 문자 조합은 7개가 아닌 10개의 가능한 코드로 매핑됩니다.

  • 두 개의 연속 사설 토토가 단일 소리를 갖는 경우 단일 숫자로 코딩됩니다.

  • 문자 또는 문자 조합이 다른 소리를 낼 수 있는 경우 모든 가능성을 포괄하기 위해 여러 코드가 방출됩니다.

이 함수는 입력에 대한 Daitch-Mokotoff soundex 코드를 생성합니다:

daitch_mokotoff(출처text)는 텍스트[]를 반환합니다.

결과에는 그럴듯한 발음의 개수에 따라 하나 이상의 코드가 포함될 수 있으므로 배열로 표시됩니다.

Daitch-Mokotoff soundex 코드는 6자리로만 구성되므로,출처단어나 이름이 바람직합니다.

다음은 몇 가지 예입니다:

SELECT daitch_mokotoff('조지');
 daitch_mokotoff
-----------------
 595000

SELECT daitch_mokotoff('존');
 daitch_mokotoff
-----------------
 160000,460000

SELECT daitch_mokotoff('비어슈바흐');
                      daitch_mokotoff
----------------------------------------------
 794575,794574,794750,794740,745750,745740,747500,747400

SELECT daitch_mokotoff('슈워츠제네거');
 daitch_mokotoff
-----------------
 479465

단일 이름 일치의 경우 반환된 텍스트 배열은 다음을 사용하여 직접 일치시킬 수 있습니다.&&연산자: 모든 중복은 일치로 간주될 수 있습니다. 효율성을 위해 GIN 인덱스를 사용할 수 있습니다. 참조PostgreSQL : 문서 : 개발 : 65.4. 진 스포츠 토토 베트맨그리고 이 예:

CREATE TABLE s(nm 텍스트);
gin (daitch_mokotoff(nm)) WITH (fastupdate = off)를 사용하여 ix_s_dm ON s 인덱스 생성;

s(nm) 값에 삽입
  ('슈워츠제네거'),
  ('존'),
  ('제임스'),
  ('스타인먼'),
  ('스타인메츠');

SELECT * FROM s WHERE daitch_mokotoff(nm) && daitch_mokotoff('Swartzenegger');
SELECT * FROM s WHERE daitch_mokotoff(nm) && daitch_mokotoff('제인');
SELECT * FROM s WHERE daitch_mokotoff(nm) && daitch_mokotoff('Jens');

순서에 관계없이 원하는 수의 이름을 색인화하고 일치시키기 위해 전체 텍스트 검색 기능을 사용할 수 있습니다. 참조토토 사이트 추천 : 문서 : 개발 : 12 장. 전문 검색그리고 이 예:

CREATE FUNCTION soundex_tsVector(v_name text) tsVector를 반환합니다.
원자 시작
  SELECT to_ts벡터('단순',
                     string_agg(array_to_string(daitch_mokotoff(n), ' '), ' '))
  FROM regexp_split_to_table(v_name, '\s+') AS n;
끝;

함수 생성 soundex_tsquery(v_name text) tsquery를 반환합니다.
원자 시작
  SELECT string_agg('(' || array_to_string(daitch_mokotoff(n), '|') || ')', '&')::tsquery
  FROM regexp_split_to_table(v_name, '\s+') AS n;
끝;

CREATE TABLE s(nm 텍스트);
gin (soundex_tsVector(nm)) WITH (fastupdate = off)를 사용하여 ix_s_txt ON s 인덱스 생성;

s(nm) 값에 삽입
  ('존 도우'),
  ('제인 로'),
  ('공개 존 Q.'),
  ('조지 베스트'),
  ('존 얌슨');

SELECT * FROM s WHERE soundex_tsVector(nm) @@ soundex_tsquery('john');
SELECT * FROM s WHERE soundex_tsVector(nm) @@ soundex_tsquery('jane doe');
SELECT * FROM s WHERE soundex_tsVector(nm) @@ soundex_tsquery('john public');
SELECT * FROM s WHERE soundex_tsVector(nm) @@ soundex_tsquery('besst, giorgio');
SELECT * FROM s WHERE soundex_tsVector(nm) @@ soundex_tsquery('제임슨 존');

인덱스 재검사 중 soundex 코드 재계산을 피하려면 표현식의 인덱스 대신 별도의 열에 있는 인덱스를 사용할 수 있습니다. 이를 위해 저장된 생성 열을 사용할 수 있습니다. 참조PostgreSQL : 문서 : 개발 : 5.4. 범퍼카 토토 된 열.

F.16.3. 레벤슈타인#

이 함수는 두 사설 토토 사이의 Levenshtein 거리를 계산합니다:

levenshtein(소스 텍스트, 대상 텍스트, ins_cost int, del_cost int, sub_cost int)는 int를 반환합니다.
levenshtein(소스 텍스트, 대상 텍스트)는 int를 반환합니다.
levenshtein_less_equal(소스 텍스트, 대상 텍스트, ins_cost int, del_cost int, sub_cost int, max_d int)는 int를 반환합니다.
levenshtein_less_equal(소스 텍스트, 대상 텍스트, max_d int)는 int를 반환합니다.

둘 다출처그리고대상null이 아닌 문자열일 수 있으며 최대 255자입니다. 비용 매개변수는 문자 삽입, 삭제 또는 대체에 대해 각각 청구할 금액을 지정합니다. 함수의 두 번째 버전에서처럼 비용 매개변수를 생략할 수 있습니다. 이 경우 기본값은 모두 1입니다.

levenshtein_less_equal는 작은 거리만 관심 대상인 경우에 사용하기 위한 Levenshtein 함수의 가속 버전입니다. 실제 거리가 이하인 경우max_d그러면levenshtein_less_equal올바른 거리를 반환합니다. 그렇지 않으면 다음보다 큰 값을 반환합니다.max_d. 만일max_d음수이면 동작은 다음과 동일합니다.levenshtein.

예:

test=# SELECT levenshtein('GUMBO', 'GAMBOL');
 레벤슈타인
-------------
           2
(1줄)

test=# SELECT levenshtein('GUMBO', 'GAMBOL', 2, 1, 1);
 레벤슈타인
-------------
           3
(1줄)

test=# SELECT levenshtein_less_equal('extensive', 'exhaustive', 2);
 levenshtein_less_equal
-----------
                      3
(1줄)

test=# SELECT levenshtein_less_equal('extensive', 'exhaustive', 4);
 levenshtein_less_equal
-----------
                      4
(1행)

F.16.4. 메타폰#

Metaphone은 Soundex와 마찬가지로 입력 사설 토토에 대한 대표 코드를 구성한다는 아이디어를 기반으로 합니다. 두 사설 토토이 동일한 코드를 갖고 있으면 유사한 것으로 간주됩니다.

이 함수는 입력 문자열의 메타폰 코드를 계산합니다:

metaphone(source text, max_output_length int)은 텍스트를 반환합니다.

출처최대 255자의 null이 아닌 사설 토토이어야 합니다.max_output_length출력 메타폰 코드의 최대 길이를 설정합니다. 더 길면 출력이 이 길이로 잘립니다.

예:

test=# SELECT 메타폰('GUMBO', 4);
 메타폰
-----------
 KM
(1행)

F.16.5. 이중 메타폰#

더블 메타폰 시스템은 2를 계산합니다.다음과 같군요주어진 입력 사설 토토에 대한 사설 토토 — a1차그리고대체. 대부분의 경우 동일하지만, 특히 영어가 아닌 이름의 경우 발음에 따라 약간 다를 수 있습니다. 다음 함수는 기본 코드와 대체 코드를 계산합니다.

dmetaphone(소스 텍스트)은 텍스트를 반환합니다.
dmetaphone_alt(소스 텍스트)는 텍스트를 반환합니다.

입력 사설 토토에는 길이 제한이 없습니다.

예:

test=# SELECT dmetaphone('gumbo');
 디메타폰
------------
 KMP
(1행)