はじめに
Docker で SQL Server を起動できても、そのままフルテキスト検索が使えるとは限りません。
フルテキスト検索は、文章を単語に分解した索引を使って検索する機能です。利用するには、サーバー側のコンポーネントと、検索対象テーブルのフルテキストインデックスが必要です。
この記事では、公式の SQL Server コンテナーイメージに追加パッケージを組み込み、日本語の文字列を検索するところまで進めます。
対象は SQL Server 2025 / Ubuntu 24.04 ベースの Linux コンテナーです。Docker Compose v2 と x86-64 環境を前提にしています。開発・検証用の Developer エディションを使用します。
有効にするために必要なもの
Linux 版 SQL Server では、フルテキスト検索用のパッケージ mssql-server-fts をインストールします。Microsoft Learn のインストール手順に、Ubuntu 向けのコマンドが公開されています。
Docker では、この追加インストールを Dockerfile に記述します。起動済みコンテナーに手作業で追加するだけだと、コンテナーを作り直したときに失われるためです。
Docker 用のファイルを用意する
作業用ディレクトリに、次のファイルを作成します。
sqlserver-fts/
├── Dockerfile
├── compose.yaml
├── .env
├── .gitignore
└── .dockerignore
フルテキスト検索を追加したイメージを作る
FROM mcr.microsoft.com/mssql/server:2025-CU8-ubuntu-24.04
USER root
RUN apt-get update \
&& apt-get install -y --no-install-recommends ca-certificates curl \
&& curl -fsSL https://packages.microsoft.com/config/ubuntu/24.04/mssql-server-2025.list \
-o /etc/apt/sources.list.d/mssql-server-2025.list \
&& apt-get update \
&& ACCEPT_EULA=Y apt-get install -y --no-install-recommends mssql-server-fts \
&& rm -rf /var/lib/apt/lists/*
USER mssql
ポイントは次のとおりです。
- インストール時は
USER rootに切り替え、実行時はUSER mssqlに戻します。 - SQL Server 2025 用の APT リポジトリを追加します。一般的な Microsoft 製品用リポジトリだけでは、目的のパッケージが見つからない場合があります。
- 署名検証にはベースイメージに登録済みの Microsoft の鍵を使用します。
- コンテナー内では
systemctlで SQL Server を起動せず、ベースイメージの起動処理を引き継ぎます。
リポジトリの指定は、Ubuntu への SQL Server インストール手順に基づいています。ベースイメージの OS と SQL Server のメジャーバージョンに合わせることが大切です。
この記事ではベースイメージの CU と OS を指定していますが、APT リポジトリの内容は更新されます。また、mssql-server-fts の依存関係として SQL Server 本体のパッケージが追加・更新されることがあります。厳密な再現性が必要な場合は、ベースイメージのタグまたは digest に加え、本体と FTS パッケージのバージョンも揃えて固定してください。
今回の検証では、ベースイメージは CU8 ですが、追加インストール後の本体は SQL Server 2025 CU9(17.0.5005.3) になりました。FTS パッケージも 17.0.5005.3-1 です。以下の検索手順は、この構成で確認しています。
Docker Compose の設定
services:
sqlserver:
build: .
environment:
ACCEPT_EULA: "Y"
MSSQL_PID: "Developer"
MSSQL_SA_PASSWORD: "${MSSQL_SA_PASSWORD:?Set MSSQL_SA_PASSWORD in .env}"
ports:
- "127.0.0.1:1433:1433"
volumes:
- sqlserver-data:/var/opt/mssql
volumes:
sqlserver-data:
Developer は開発・テスト向けのエディションです。本番利用時は適切なライセンスとエディションを選んでください。
ポートはローカルホストに限定し、データは名前付きボリュームに保存します。
.env には、自分で決めた強いパスワードを設定します。次の文字列は置き換え用の値です。
MSSQL_SA_PASSWORD='Replace-With-Your-Own-Strong-Password!42'
次の内容を .gitignore と .dockerignore の両方に記述します。
.env
.env
.git
ビルドして起動する
作業用ディレクトリで実行します。以下の Docker コマンドは PowerShell でも実行できます。
docker compose up -d --build
docker compose logs -f sqlserver
ログに接続受付の準備ができた旨のメッセージが表示されたら、Ctrl+C でログ表示を終了します。コンテナーは動作を続けます。
SQL Server コンテナーの起動・接続方法は、Microsoft Learn の Docker クイックスタートも確認できます。
フルテキスト検索がインストールされたか確認する
コンテナー内の sqlcmd で接続します。プロンプトに .env と同じパスワードを入力してください。
docker compose exec sqlserver /opt/mssql-tools18/bin/sqlcmd -S localhost -U sa -C
-C はサーバー証明書を信頼するオプションで、ここではローカル検証用の接続に使用しています。
この記事で使用する SQL Server 2025 のイメージでは、ツールのパスが /opt/mssql-tools18/bin になっています。
接続後、次の SQL を実行します。GO は sqlcmd で SQL をサーバーに送るためのバッチ区切りです。
SELECT @@VERSION AS Version;
SELECT FULLTEXTSERVICEPROPERTY('IsFullTextInstalled') AS IsFullTextInstalled;
GO
SELECT name, lcid
FROM sys.fulltext_languages
WHERE lcid = 1041;
GO
IsFullTextInstalled が 1 であればインストール済み、0 であれば未インストールです。関数の仕様は FULLTEXTSERVICEPROPERTY に記載されています。
1041 は日本語の言語 ID です。日本語を単語に分解する機能が登録されているかも確認しておきます。
日本語のフルテキスト検索を試す
以降も同じ sqlcmd セッションで実行します。このサンプルは新しい検証用データベースに対して一度だけ実行する想定です。
検索対象のテーブルを作る
CREATE DATABASE FullTextDemo;
GO
USE FullTextDemo;
GO
CREATE TABLE dbo.Documents
(
Id int NOT NULL CONSTRAINT PK_Documents PRIMARY KEY,
Body nvarchar(1000) NOT NULL
);
INSERT INTO dbo.Documents (Id, Body)
VALUES
(1, N'自転車で公園へ行きます。'),
(2, N'図書館で本を借ります。');
GO
日本語を格納するため、列の型を nvarchar にし、文字列リテラルに N を付けています。
カタログとインデックスを作る
フルテキストカタログは、フルテキストインデックスをまとめる論理的な入れ物です。
CREATE FULLTEXT CATALOG DemoCatalog;
GO
CREATE FULLTEXT INDEX ON dbo.Documents
(
Body LANGUAGE 1041
)
KEY INDEX PK_Documents
ON DemoCatalog
WITH CHANGE_TRACKING AUTO;
GO
KEY INDEX には、各行を一意に識別できる、単一列かつ NULL を許可しない一意インデックスを指定します。今回は主キーの PK_Documents を使用しています。
CHANGE_TRACKING AUTO では初回のインデックス作成後も変更が自動反映されます。ただし、反映は非同期です。詳細は CREATE FULLTEXT INDEX を確認してください。
検索する
SELECT Id, Body
FROM dbo.Documents
WHERE CONTAINS(Body, N'"自転車"', LANGUAGE 1041);
GO
検証では、インデックスへの反映後に次の1行が取得できました。作成直後に結果が空だった場合は、少し待って再実行してください。
Id Body
1 自転車で公園へ行きます。
反映状況の確認には、次のクエリを使用できます。
SELECT
OBJECTPROPERTYEX(OBJECT_ID(N'dbo.Documents'), 'TableFulltextPopulateStatus') AS PopulateStatus,
OBJECTPROPERTYEX(OBJECT_ID(N'dbo.Documents'), 'TableFulltextItemCount') AS IndexedItems;
GO
このサンプルでは、PopulateStatus が 0(処理中ではない)、IndexedItems が 2 になることを確認します。状態が 0 というだけでは、取り込み成功とは判断できません。各プロパティの意味は OBJECTPROPERTYEX に記載されています。
フルテキスト検索は、LIKE N'%文字列%' と同じ部分一致検索ではありません。単語の分割結果や、検索対象から除外される単語(ストップワード)によって検索結果が変わります。詳しくは フルテキスト検索のクエリ を確認してください。
確認が終わったら QUIT で sqlcmd を終了します。
うまくいかないときの確認ポイント
| 症状 | 確認すること |
|---|---|
mssql-server-fts が見つからない |
SQL Server 2025 用の APT リポジトリを追加したか、追加後に apt-get update を実行したか |
IsFullTextInstalled が 0
|
FTS を追加したイメージから起動しているか、接続先が別の SQL Server ではないか |
| コンテナーが終了する |
docker compose logs sqlserver でパスワード要件やメモリ不足などのエラーを確認する |
sqlcmd が見つからない |
使用中のイメージのバージョンとツールの配置場所を確認する |
| フルテキストインデックスが作れない | 対象列の型と KEY INDEX の要件、コンポーネントのインストール状態を確認する |
| 検索結果が空になる | 取り込み状況、対象データ、言語設定、ストップワードを確認する |
設定を変更した場合は、イメージの再ビルドとコンテナーの再作成を行います。単なる restart ではイメージの変更は反映されません。
docker compose up -d --build --force-recreate
既存の名前付きボリュームを再利用する場合、.env のパスワードを書き換えるだけでは既存の sa のパスワードは変更されません。
検証後の停止
docker compose down
名前付きボリュームは残るので、次回の起動時にもデータを利用できます。
データも破棄する場合だけ docker compose down -v を実行してください。
まとめ
- Linux コンテナーでフルテキスト検索を利用するには、
mssql-server-ftsを組み込んだイメージを作成します。 -
FULLTEXTSERVICEPROPERTY('IsFullTextInstalled')でコンポーネントの有無を確認します。 - 検索対象テーブルにはフルテキストインデックスを作成します。日本語の言語 ID は
1041です。 - インデックスへの反映は非同期なので、作成直後の空の検索結果だけで設定失敗とは判断しないことがポイントです。