> ## 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 にもたらし、2 つの文字列がどれほど似ているかを採点するため、綴りを間違えた検索語でも目的の行が見つかります。

`vsql_trgm` は PostgreSQL の `pg_trgm` の移植です。文字列を 3 文字の断片に分け、2 つの文字列がどれだけの断片を共有しているかで採点するため、綴りを間違えた検索語でも目的の行が見つかります。`LIKE` では厳しすぎ、全文検索では粗すぎるときに使用します。

| | |
| - | - |
| **メンテナー** | VillageSQL |
| **ソースと完全なドキュメント** | [villagesql/vsql-trgm](https://github.com/villagesql/vsql-trgm) |
| **ライセンス** | GPL-2.0 |

## インストール

インストールスクリプト、Docker イメージ、またはリリース tarball で VillageSQL をインストールした場合、`vsql_trgm.veb` はすでにサーバーの `lib/veb/` ディレクトリにあります。1 つのステートメントでサーバーにインストールします。

```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)のビルド手順に従ってください。

## 追加される機能

3 つの関数ファミリーを追加します。通常のファミリーは 2 つの文字列全体を比較します。word ファミリーは 2 番目の文字列の中で最もよく一致する部分文字列を見つけます。strict word ファミリーは同じことを単語の境界に揃えて行います。各ファミリーには独自のデフォルトのしきい値があります。

| 関数 | 戻り値 | 説明 |
| - | - | - |
| `trgm_show(s)` | text | 文字列のトライグラムを JSON 配列で返す |
| `trgm_similarity(a, b)` | real | 2 つの文字列が共通に持つトライグラムの割合。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 | word 類似度が 0.6 に達したとき 1 |
| `trgm_strict_word_similarity(a, b)` | real | word 形式と同じで、単語の境界に揃えたもの |
| `trgm_strict_word_distance(a, b)` | real | 1 からその値を引いたもの |
| `trgm_strict_word_similar(a, b)` | int | strict word 類似度が 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]
>
> `vsql_trgm` はセッション状態を保持しないため、PostgreSQL の `set_limit()` に相当するものはここにはありません。代わりに、望むしきい値を `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/ja/extensions/install.md) — `INSTALL EXTENSION` の仕組みと、サーバーがバンドルを探す場所
* [利用可能な拡張機能](https://villagesql.com/docs/ja/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.