Cloudflare AI Search: 日本語のキーワード検索は keyword_tokenizer: "trigram" にする
AI Search のキーワード検索(BM25)で日本語・中国語・韓国語の質問文がヒットするようになった。ただし既定の porter ではなく trigram トークナイザーを選んでおく必要がある。
どんな問題?
- 既定の
porterはスペースと句読点で単語を切る。日本語は単語の間にスペースがないので、経費精算の締め日はいつですか?のような質問は 1 つの長い完全一致フレーズ扱いになり、キーワード検索の結果がほぼ 0 件になっていた - 2026-10-16 の更新で、
trigram(3 文字ずつずらした窓)を使えば、自然文の質問でも本文中の 3 文字列と照合されるようになった - ハイブリッド検索(ベクトル + キーワード)は新規インスタンスの既定。ベクトル側は日本語でも動くが、キーワード側が空振りしていると固有名詞や型番のような「完全一致で拾いたい語」が弱くなる
設定
インスタンス作成時(または更新時)に indexing_options.keyword_tokenizer を指定する。
ts
const instance = await env.AI_SEARCH.create({
id: "docs-ja",
index_method: { vector: true, keyword: true }, // ハイブリッド
fusion_method: "rrf",
indexing_options: { keyword_tokenizer: "trigram" },
retrieval_options: { keyword_match_mode: "or" }, // and = 精度重視 / or = 再現率重視
});| 値 | 既定 | 向いている内容 |
|---|---|---|
porter | ○ | 英語などスペース区切りの自然文(語幹処理で "running" が "run" に一致) |
trigram | 日本語・中国語・韓国語、コード("config" が "configuration" に一致) |
注意点
- トークナイザーを変えると全件再インデックスになる。件数が多いインスタンスは時間と取り込み量を見込んでおく
trigramでは 3 文字未満の語は単独では一致しない(「AI」「DB」「締日」のような 2 文字語)。短い語が大事なら、ベクトル検索との併用(ハイブリッド)を前提にする- AI Search は 2026-11-01 から従量課金が始まる(無料枠あり)。再インデックスのタイミングに注意
- 日本語の全文検索を自前の SQLite / DuckDB でやる場合は SQLite / DuckDB: Vaporetto で日本語フルテキスト検索拡張を載せる も参照
出典
- @CFchangelog · 2026-10-17
- Changelog: developers.cloudflare.com
- ドキュメント(Keyword search): developers.cloudflare.com