---
slug: "MySQLInnoDBのフルテキストインデックスで、ストップワードフィルタを無効にする(in,by,isなどで検索できるようにする)"
title: "MySQL InnoDBのフルテキストインデックスで、ストップワードフィルタを無効にする (in, by, is などで検索できるようにする)"
description: "\n\n\n\n経緯\nMySQL5.6 の、InnoDB にバイグラムでフルテキストインデックスを作っているのですが、\nTWIN という文字を検索しようとした所、"
url: "https://www.ytyng.com/blog/MySQLInnoDBのフルテキストインデックスで、ストップワードフィルタを無効にする(in,by,isなどで検索できるようにする)"
publish_date: "2015-12-01T06:42:57Z"
created: "2015-12-01T06:42:57Z"
updated: "2026-02-27T11:04:19.041Z"
categories: ["MySQL"]
keywords: ""
featured_image_url: "https://media.ytyng.com/resize/20230812/02638a1df05f44c0a634deb8694e6fc6.png.webp?width=768"
has_video: false
has_music: false
video_urls: []
music_urls: []
lang: "ja"
---

# MySQL InnoDBのフルテキストインデックスで、ストップワードフィルタを無効にする (in, by, is などで検索できるようにする)

<div class="document">


<div class="section" id="id1">
<h3>経緯</h3>
<p>MySQL5.6 の、InnoDB にバイグラムでフルテキストインデックスを作っているのですが、
TWIN という文字を検索しようとした所、</p>
<pre class="literal-block">SELECT COUNT(*) FROM ...
WHERE MATCH(search_text) AGAINST ('+tw +wi +in' IN BOOLEAN MODE)
</pre>
<p>... 結果が出てきません。</p>
<p>'+tw +wi' だと結果があります(twin がヒットします)。</p>
<p>調査した所、「ストップワード」という機能があり、in や by, is なんかは検索インデックスが作られないようになっている仕様でした。</p>
<p>※ InnoDB のフルテキストインデックスの場合のみ。MyISAM の場合は、デフォルトはストップワードテーブルは使われない。</p>
<p>ストップワードの内容を表示するには</p>
<pre class="literal-block">SELECT * FROM INFORMATION_SCHEMA.INNODB_FT_DEFAULT_STOPWORD;
</pre>
<p>in, is, it, la, of, on などが入ってます。</p>
<p>このテーブルは、自分で別のテーブルを作ってそちらを使うように設定もできますが、今回はそもそもストップワードテーブルを使ってのインデックス生成フィルタリングを無効にします。</p>
<p>無効にせず、ストップワードテーブルを差し替えるにはこちらのページが参考になります。</p>
<p>MySQL :: MySQL 5.6 リファレンスマニュアル :: 12.9.4 全文ストップワード</p>
<p><a class="reference external" href="https://dev.mysql.com/doc/refman/5.6/ja/fulltext-stopwords.html">https://dev.mysql.com/doc/refman/5.6/ja/fulltext-stopwords.html</a></p>
</div>
<div class="section" id="id2">
<h3>ストップワードを無効にする設定</h3>
<p>InnoDB でのストップワード判定を無効にするには、設定の innodb_ft_enable_stopword を変更します。</p>
<p>現状の確認</p>
<pre class="literal-block">SHOW VARIABLES LIKE 'innodb_ft_enable_stopword';
</pre>
<pre class="literal-block">innodb_ft_enable_stopword   ON
</pre>
<p>デフォルトでは有効になっています。</p>
<p>なので、my.cnf などの設定ファイルに</p>
<pre class="literal-block">[mysqld]
innodb_ft_enable_stopword = OFF
</pre>
<p>として、MySQL を再起動すると</p>
<pre class="literal-block">SHOW VARIABLES LIKE 'innodb_ft_enable_stopword';
</pre>
<pre class="literal-block">innodb_ft_enable_stopword   OFF
</pre>
<p>反映されます。</p>
<p>Ubuntu なんかでは、 /etc/mysql/conf.d/ ディレクトリが用意されているので、その中に設定ファイルを放り込むと良いでしょう。</p>
<p>僕のはこんな感じ</p>
<p>/etc/mysql/conf.d/fulltext_search.cnf</p>
<pre class="literal-block">[mysqld]
# Fulltext search bigram settings.
ft_min_word_len = 2
innodb_ft_min_token_size = 2
innodb_ft_enable_stopword = OFF
</pre>
</div>
<div class="section" id="id3">
<h3>検索インデックスの再生成</h3>
<p>インデックスの再生成は、</p>
<p>REPAIR TABLE table_name QUICK; ではなく (これは MyISAM の場合)</p>
<p>InnoDB の場合は</p>
<pre class="literal-block">ALTER TABLE table_name FORCE;
</pre>
<p>で行えます。</p>
<pre class="literal-block">SELECT COUNT(*) FROM ...
WHERE MATCH(search_text) AGAINST ('+tw +wi +in' IN BOOLEAN MODE)
</pre>
<p>→ 結果でました!</p>
</div>
</div>
