Mattermostの日本語検索ができない・当たらないときの直し方|MM_FEATUREFLAGS_CJKSEARCH を1行足して実機で確認【11.7.0】

※2026年10月7日時点の情報です。弊社のサーバーで Mattermost 11.7.0(公式 Docker 構成の既定バージョン)を動かし、確認しています。版によって挙動が異なる(v11.9 以降は既定で直っている)ため、最新の情報は公式ドキュメントをご確認ください。

この記事は、Mattermost をセルフホストして Slack の代わりになるか実機検証した記事の続編です。構築手順・メモリ・料金比較は前の記事で扱い、ここでは「日本語で検索しても当たらない」問題の直し方だけを説明します。

結論:Mattermostの日本語検索は環境変数1行で直せる(v11.9以降は設定不要)

  • 原因は、機能フラグ CJKSearch が 11.7.0 では既定で無効になっていること。PostgreSQL 側での設定は不要
  • docker-compose.yml の mattermost サービスの environment に MM_FEATUREFLAGS_CJKSEARCH=true を1行追加して再起動したところ、既存の投稿も含めて途中の語で当たるようになった(再インデックス不要、応答 11ms)
  • このフラグの追加は v11.5 で、v11.9(2026年7月16日)から既定で有効になっている。11.9 以降なら設定する必要はない
  • 弊社では当初、postgres 側の environment に書いてしまい効かなかった。記述する場所には注意が必要

症状:Mattermostで検索に当たる語と当たらない語

「検証用の投稿です。日本語の表示と検索を確認しています。」という投稿を検索した結果がこちらです(11.7.0、設定変更前)。

検索した語 結果 読み方
検証/日本語/投稿です 0件 文の途中にある語では当たらない
検証*(末尾に * を付けた前方一致) 1件 文の先頭からの一致なら当たる
検証用の投稿です(句点までの文全体) 1件 かたまりを丸ごと入れると当たる
verification(英語の投稿に対して) 1件 英語なら通常どおり当たる
区切り(「空白 区切り テスト 投稿」という投稿に対して) 1件 日本語も空白で区切られていれば当たる
Mattermost で日本語の投稿を「検証」で検索し、0件と表示された画面
画面下には「検証用の投稿です」が見えているものの、「検証」での検索結果は0件(Mattermost 11.7.0、2026年10月7日に弊社で撮影)

画面には投稿があるのに結果は0件なので、検索自体が壊れているように見えます。原因を切り分けるポイントは、英語と空白区切りの日本語は当たるという点です。

原因:既定の検索は空白を使って単語を区切る仕組み

既定では PostgreSQL の全文検索を使い、空白を区切りとして単語を取り出します。空白のない日本語の文では句点までが丸ごと1語と扱われるため、「検証」のような途中の語は一致しません。前方一致と文全体での検索だけが当たった理由は、この仕組みにあります。

公式ドキュメントによると、v11.5 からは機能フラグ MM_FEATUREFLAGS_CJKSEARCH によって、中国語・日本語・韓国語の検索を有効にできます(2026年10月7日確認)。なお、古い記事で紹介されている Bleve 検索は v11.0 で廃止されているため、その手順は使えません。

直し方:docker-compose.ymlのmattermostサービスに1行追加して再起動する

ここでは、公式の mattermost/docker 構成を使っていることを前提とします。MM_ から始まる環境変数で config.json の同名の設定を上書きする仕組みを利用します。

services:
  postgres:
    environment:
      - POSTGRES_USER=...        # ← ここではない
  mattermost:
    environment:
      - TZ
      - MM_SQLSETTINGS_DRIVERNAME
      - MM_SQLSETTINGS_DATASOURCE
      - MM_SERVICESETTINGS_SITEURL
      - MM_FEATUREFLAGS_CJKSEARCH=true   # ← この1行を足す

追加したら、起動時と同じコマンドで作り直します。弊社の環境では15秒以内に復帰しています。

docker compose -f docker-compose.yml -f docker-compose.without-nginx.yml up -d

設定が効いているかどうかは、次の2つで確認できます。

  1. 管理者のトークンを使って設定 API(GET /api/v4/config)を呼び出し、FeatureFlags.CJKSearch が true になっていること
  2. 設定前には 0件だった語が検索に当たること。弊社で確認した「検証」「日本語」「東京」「会議室」「大阪」「請求書」「確認しました」は、すべて1件ずつ当たりました

設定する前に作成した投稿もそのまま検索に当たり、再インデックスは不要でした。英語での検索も従来どおり使えます。

効かないときの確認と注意点:書く場所、Elasticsearch、大規模での性能

状況 確認・対処
追加しても 0件のまま 弊社がやった失敗。compose の最初に出てくる environment は postgres 側なので、そこに書いても Mattermost には渡らない。mattermost サービス側に記述し、設定 API で true になっているか確認する
System Console から変更したい 環境変数で指定した設定は System Console から変更できなくなる(公式に明記)。設定の管理は compose 側に一本化する
v11.9 以降を使用している 既定で有効になっているため追加不要。.env の MATTERMOST_IMAGE_TAG を上げる手順は前の記事を参照
Elasticsearch/OpenSearch を使用している 別の設定である ElasticsearchSettings.EnableCJKAnalyzers(既定 false)を使う。日本語用プラグイン analysis-kuromoji などには v11.6 で対応。有料プラン向け
投稿数が多い 公式では投稿 250万件を超えたら Elasticsearch か OpenSearchを推奨。国内の検証記事(Zenn)は、このフラグがインデックスを使わない部分一致への切り替えであり、事実上の全件走査となって大規模では重くなると指摘している

弊社の環境では検証用の投稿が十数件程度だったため 11ms でしたが、数年分の履歴がある運用では異なる数字になるはずです。数十人で使う社内チャットなら、まずはこのフラグで様子を見て、重くなった段階で Elasticsearch を検討する流れで十分だと考えています。

まとめ:Mattermostの日本語検索は立てた直後に必ず試す

  • 立てた直後に日本語の投稿を途中の語で検索し、当たるかどうかを確かめる
  • 11.7.0 など 11.9 未満を使っているなら MM_FEATUREFLAGS_CJKSEARCH=true を mattermost サービスの environment に1行追加して再起動
  • 11.9 以降では設定不要。大規模な環境なら Elasticsearch/OpenSearch を検討

構築手順・メモリ・エディションの選び方・Slack との料金比較は、1本目の Mattermost セルフホスト実機検証の記事で紹介しています。概要や他の Slack 代替 OSS については、OSSMatch の Mattermost の詳細ページをご覧ください。

「日本語検索の設定まで含めて立ててほしい」「Elasticsearch が必要な規模か判断したい」といったご相談は、合同会社Edel Hearts のOSS導入支援で受け付けています。弊社自身も書く場所を間違えてつまずいた経験があるため、つまずきどころを率直にお伝えします。

出典