> ## Documentation Index
> Fetch the complete documentation index at: https://villagesql.com/docs/llms.txt
> Use this file to discover all available pages before exploring further.

# MySQL용 vsql_trgm 확장 기능

> vsql_trgm 확장 기능은 pg_trgm 트라이그램 유사도를 MySQL에 가져와 두 문자열이 얼마나 비슷한지 점수를 매기므로, 철자가 틀린 검색어로도 해당 행을 찾습니다.

`vsql_trgm`은 PostgreSQL의 `pg_trgm`을 포팅한 것입니다. 문자열을 세 글자 조각으로
나누고 두 문자열이 공유하는 조각의 수로 점수를 매기므로, 철자가 틀린 검색어로도
해당 행을 찾을 수 있습니다. `LIKE`는 너무 엄격하고 전문 검색은 너무 거칠 때
사용하세요.

| | |
| - | - |
| **관리자** | VillageSQL |
| **소스 및 전체 문서** | [villagesql/vsql-trgm](https://github.com/villagesql/vsql-trgm) |
| **라이선스** | GPL-2.0 |

## 설치

설치 스크립트, Docker 이미지 또는 릴리스 tarball로 VillageSQL을 설치했다면
`vsql_trgm.veb`는 이미 서버의 `lib/veb/` 디렉터리에 있습니다. 문 하나로 서버에
설치하세요:

```sql theme={null}
INSTALL EXTENSION vsql_trgm;
```

설치되었는지 확인합니다:

```sql theme={null}
SELECT EXTENSION_NAME
FROM INFORMATION_SCHEMA.EXTENSIONS
WHERE EXTENSION_NAME = 'vsql_trgm';
```

```
+----------------+
| EXTENSION_NAME |
+----------------+
| vsql_trgm      |
+----------------+
```

직접 빌드하려면 [저장소](https://github.com/villagesql/vsql-trgm)의 빌드
지침을 따르세요.

## 추가되는 기능

세 가지 함수 계열을 추가합니다. 일반 계열은 두 문자열 전체를 비교합니다. 단어
계열은 두 번째 문자열에서 가장 잘 일치하는 부분 문자열을 찾습니다. 엄격한 단어
계열은 같은 일을 하되 단어 경계에 맞춥니다. 각 계열은 자체 기본 임계값을
가집니다.

| 함수 | 반환값 | 설명 |
| - | - | - |
| `trgm_show(s)` | text | 문자열의 트라이그램을 JSON 배열로 반환 |
| `trgm_similarity(a, b)` | real | 두 문자열이 공유하는 트라이그램의 비율, 0부터 1까지 |
| `trgm_distance(a, b)` | real | 1에서 유사도를 뺀 값 |
| `trgm_similar(a, b)` | int | 유사도가 0.3에 도달하면 1 |
| `trgm_similar_threshold(a, b, t)` | int | 0과 1 사이에서 직접 고른 임계값에 도달하면 1 |
| `trgm_word_similarity(a, b)` | real | `a`와 `b`의 임의의 부분 문자열 사이의 최고 유사도 |
| `trgm_word_distance(a, b)` | real | 1에서 그 값을 뺀 값 |
| `trgm_word_similar(a, b)` | int | 단어 유사도가 0.6에 도달하면 1 |
| `trgm_strict_word_similarity(a, b)` | real | 단어 형식과 같되 단어 경계에 맞춤 |
| `trgm_strict_word_distance(a, b)` | real | 1에서 그 값을 뺀 값 |
| `trgm_strict_word_similar(a, b)` | int | 엄격한 단어 유사도가 0.5에 도달하면 1 |

## 예제

작은 이름 테이블을 만듭니다:

```sql theme={null}
CREATE TABLE people (id INT PRIMARY KEY, name VARCHAR(32));

INSERT INTO people VALUES
    (1, 'Jonathan Smith'),
    (2, 'John Smyth'),
    (3, 'Joan Smithe'),
    (4, 'Peter Brown');
```

아무도 입력하지 않은 철자로 검색하고, 돌아온 결과의 순위를 매깁니다:

```sql theme={null}
SELECT name, ROUND(trgm_similarity(name, 'Jon Smith'), 3) AS score
FROM people
WHERE trgm_similar(name, 'Jon Smith') = 1
ORDER BY score DESC;
```

```
+----------------+-------+
| name           | score |
+----------------+-------+
| Jonathan Smith | 0.562 |
| Joan Smithe    | 0.467 |
| John Smyth     | 0.312 |
+----------------+-------+
```

Peter Brown은 공유하는 트라이그램이 너무 적어 0.3에 도달하지 못하므로 나타나지
않습니다. 무엇이 비교되는지 보려면 트라이그램 자체를 요청하세요:

```sql theme={null}
SELECT trgm_show('Smith') AS trigrams;
```

```
+---------------------------------------+
| trigrams                              |
+---------------------------------------+
| ["  s"," sm","ith","mit","smi","th "] |
+---------------------------------------+
```

채움 공백은 의도적입니다. 문자열의 시작과 끝이 점수에 반영되게 합니다.

> [!NOTE]
>
> PostgreSQL의 `set_limit()`에 대응하는 것은 여기에 없습니다. `vsql_trgm`은
> 세션 상태를 유지하지 않기 때문입니다. 대신 원하는 임계값을
> `trgm_similar_threshold()`에 전달하세요. 유사도 필터는 모든 행을 읽으므로,
> 큰 테이블에 실행하기 전에 측정하세요.

## 참고 항목

* [MySQL에서의 트라이그램 유사도](https://villagesql.com/docs/en/guides/trigram-similarity.md) — 임계값, 순위, 큰 테이블에서의 비용
* [퍼지 문자열 매칭](https://villagesql.com/docs/en/guides/fuzzy-string-matching.md) — 대안으로서의 음성 코드와 편집 거리
* [전문 검색](https://villagesql.com/docs/en/guides/full-text-search.md) — 이름이 아니라 문서에 맞는 도구
* [확장 기능 설치](https://villagesql.com/docs/ko/extensions/install.md) — `INSTALL EXTENSION`의 동작 방식과 서버가 번들을 찾는 위치
* [사용 가능한 확장 기능](https://villagesql.com/docs/ko/extensions/catalog) — 전체 카탈로그
* [villagesql/vsql-trgm](https://github.com/villagesql/vsql-trgm) — 소스, 빌드 지침, 알려진 제한 사항


This documentation is built and hosted on [Mintlify](https://mintlify.com), a developer documentation platform.