メインコンテンツまでスキップ

ユースケースに適したアナライザーの選択

このガイドでは、Zilliz Cloud のテキストコンテンツに最適な アナライザー を選択・設定する方法を解説します。

本ガイドは 実践的な意思決定 に焦点を当てており、どのアナライザーを使うべきか、いつカスタマイズすべきか、設定をどう検証するかを扱います。アナライザーの構成要素やパラメーターに関する背景知識については、アナライザー概要 を参照してください。

基本概念: アナライザーの仕組み

アナライザーは、全文検索(BM25 ベース)、フレーズ一致テキスト一致 などの機能でテキストデータを検索可能にするために処理を行います。2 段階のパイプラインを通じて、生のテキストを検索可能な個々のトークンに変換します。

JwMZwIYUwhbSZ4bjhxcc1PfNnvx

  1. トークン化(必須): この初期段階では、トークナイザー を適用して連続するテキスト文字列をトークンと呼ばれる個別の意味単位に分割します。トークン化の手法は、言語やコンテンツの種類によって大きく異なります。

  2. トークンフィルタリング(オプション): トークン化の後、フィルター を適用してトークンの変更、削除、または調整を行います。これらの操作には、すべてのトークンを小文字に変換する、一般的な無意味語(ストップワードなど)を削除する、単語を語幹に還元する(ステミング)などが含まれます。

例:

plaintext
Input: "Hello World!"
1. Tokenization → ["Hello", "World", "!"]
2. Lowercase & Punctuation Filtering → ["hello", "world"]

アナライザーの選択が重要な理由

選択するアナライザーは、検索品質と関連性 に直接影響します。

不適切なアナライザーを使用すると、過剰または過少なトークン化、用語の欠落、無関係な結果の表示などを引き起こす可能性があります。

問題

症状

例(入力と出力)

原因(不適切なアナライザー)

解決策(適切なアナライザー)

過剰トークン化

技術用語、識別子、URL が誤って分割される

  • "user_id"['user', 'id']

  • "C++"['c']

standard アナライザー

whitespace トークナイザーを使用し、alphanumonly フィルターと組み合わせます。

過少トークン化

複数語のフレーズが単一のトークンとして扱われる

"state-of-the-art"['state-of-the-art']

whitespace トークナイザーを使用するアナライザー

句読点やスペースで分割するには standard トークナイザーを使用し、カスタム regex フィルターを併用します。

言語の不一致

外国語の検索結果が無意味になる

中国語テキスト: "机器学习"['机器学习'](1 トークン)

english アナライザー

chinese などの言語固有のアナライザーを使用します。

入力方式の不一致

ユーザーはピンインを入力するが、インデックス化されたテキストは漢字である。

中国語テキスト: "足球"; クエリテキスト: "zuqiu"

漢字トークンのみを出力するアナライザー

jieba トークナイザーと pinyin フィルターを備えたカスタムアナライザーを使用します。

ステップ 1: アナライザーの選択は必要か?

テキスト検索機能(全文検索フレーズ一致テキスト一致 など)を使用しているものの、アナライザーを明示的に指定していない 場合、

Zilliz Cloud は自動的に 標準アナライザー を適用します。

標準アナライザーの動作:

  • スペースと句読点でテキストを分割する

  • すべてのトークンを小文字に変換する

変換例:

plaintext
Input: "The Milvus vector database is built for scale!"
Output: ['the', 'milvus', 'vector', 'database', 'is', 'built', 'for', 'scale']

ステップ 2: 標準アナライザーで要件を満たせるか確認する

以下の表を参考に、デフォルトの standard アナライザー で要件を満たせるかを素早く判断できます。満たさない場合は、別のアプローチを選択 する必要があります。

コンテンツ標準アナライザーで十分か?理由必要な対応
英語のブログ記事 はいデフォルトの動作で十分です。デフォルトを使用します(設定不要)。
中国語のドキュメント いいえ中国語の単語間にはスペースがないため、全体が 1 つのトークンとして扱われます。組み込みの chinese アナライザーを使用します。
技術ドキュメント いいえC++ のような用語から句読点が除去されます。whitespace トークナイザーと alphanumonly フィルターを備えたカスタムアナライザーを作成します。
フランス語/Spanish テキストなどのスペース区切り言語⚠️ 場合によるアクセント付き文字(cafécafe)が一致しない場合があります。より良い結果を得るには、asciifolding を備えたカスタムアナライザーの使用を推奨します。
多言語または不明な言語 いいえstandard アナライザーには、異なる文字セットやトークン化ルールを処理するための言語固有ロジックがありません。Unicode 対応のトークン化を行うには、icu トークナイザーを備えたカスタムアナライザーを使用します。
あるいは、多言語コンテンツをより正確に処理するために、多言語アナライザー言語識別子 の設定を検討してください。

ステップ 3: アプローチを選択する

デフォルトの 標準アナライザー では不十分な場合、以下の 2 つのアプローチからいずれかを選択します。

  • アプローチ A – 組み込みアナライザーを使用する(すぐに使用可能、言語固有)

  • アプローチ B – カスタムアナライザーを作成する(トークナイザーと一連のフィルターを手動で定義)

アプローチ A: 組み込みアナライザーを使用する

組み込みアナライザーは、主要な言語向けに事前設定されたソリューションです。デフォルトの標準アナライザーが完全に適合しない場合に、最も手軽に導入できる方法です。

利用可能な組み込みアナライザー

アナライザー

対応言語

コンポーネント

備考

standard

ほとんどのスペース区切り言語(英語、フランス語、ドイツ語、スペイン語など)

  • トークナイザー: standard

  • フィルター: lowercase

テキストの前処理用汎用アナライザーです。単一言語のシナリオでは、言語固有のアナライザー(english など)の方が優れたパフォーマンスを発揮します。

english

Dedicated から派生した英語向けアナライザー。ステミングとストップワード除去を適用し、英語の意味的一致精度を向上させます

  • トークナイザー: standard

  • フィルター: lowercase, stemmer, stop

英語のみのコンテンツには standard よりも推奨されます。

chinese

中国語

  • トークナイザー: jieba

  • フィルター: cnalphanumonly

現在はデフォルトで簡体字中国語辞書を使用します。

実装例

組み込みアナライザーを使用するには、フィールドスキーマの定義時に analyzer_params でタイプを指定するだけです。

python
# Using built-in English analyzer
analyzer_params = {
"type": "english"
}

# Applying analyzer config to target VARCHAR field in your collection schema
schema.add_field(
field_name='text',
datatype=DataType.VARCHAR,
max_length=200,
enable_analyzer=True,
analyzer_params=analyzer_params,
)
📘Notes

詳細な使用方法については、全文検索テキスト一致、またはフレーズ一致を参照してください。

パス B: カスタムアナライザーの作成

組み込みオプションで要件を満たせない場合は、トークナイザーとフィルターを組み合わせてカスタムアナライザーを作成できます。これにより、テキスト処理パイプラインを完全に制御できます。

手順 1: 言語に応じたトークナイザーの選択

コンテンツの主要言語に応じてトークナイザーを選択します。

欧米言語

スペース区切りの言語では、以下の選択肢があります。

トークナイザー

仕組み

最適な用途

standard

スペースや句読点に基づいてテキストを分割

一般的なテキスト、句読点が混在するテキスト

  • 入力: "Hello, world! Visit example.com"

  • 出力: ['Hello', 'world', 'Visit', 'example', 'com']

whitespace

空白文字のみで分割

前処理済みのコンテンツ、ユーザーが整形したテキスト

  • 入力: "user_id = get_user_data()"

  • 出力: ['user_id', '=', 'get_user_data()']

東アジア言語

辞書ベースの言語では、適切な単語分割を行うために専用のトークナイザーが必要です。

中国語

トークナイザー

仕組み

最適な用途

jieba

インテリジェントアルゴリズムを用いた中国語辞書ベースの分割

中国語コンテンツに推奨 - 辞書とインテリジェントアルゴリズムを組み合わせ、中国語向けに特別に設計されています

  • 入力: "机器学习是人工智能的一个分支"

  • 出力: ['机器', '学习', '是', '人工', '智能', '人工智能', '的', '一个', '分支']

lindera

中国語辞書 (cc-cedict) を使用した純粋な辞書ベースの形態素解析

jiebaと比較して、中国語テキストをより汎用的に処理

  • 入力: "机器学习算法"

  • 出力: ["机器", "学习", "算法"]

日本語と韓国語

言語

トークナイザー

辞書オプション

最適な用途

日本語

lindera

ipadic (汎用), ipadic-neologd (現代語), unidic (学術)

固有名詞処理に対応した形態素解析

  • 入力: "東京都渋谷区"

  • 出力: ["東京", "都", "渋谷", "区"]

韓国語

lindera

ko-dic

韓国語の形態素解析

  • 入力: "안녕하세요"

  • 出力: ["안녕", "하", "세요"]

多言語または不明な言語

言語が予測できない場合や、ドキュメント内で複数の言語が混在する場合:

トークナイザー

仕組み

最適な用途

icu

Unicode 対応トークナイゼーション (International Components for Unicode)

複数の文字体系が混在するテキスト、不明な言語、または単純なトークナイゼーションで十分な場合

  • 入力: "Hello 世界 مرحبا"

  • 出力: ['Hello', ' ', '世界', ' ', 'مرحبا']

icu を使用するケース:

  • 言語識別が現実的ではないほど複数の言語が混在している場合。

  • 多言語アナライザー言語識別子のオーバーヘッドを避けたい場合。

  • 主要言語があり、全体の意味への寄与が少ない外来語が時折含まれるコンテンツ(例: 英語のテキストに日本語やフランス語のブランド名や技術用語が散発的に含まれる場合)。

代替アプローチ: 多言語コンテンツをより正確に処理するには、多言語アナライザーまたは言語識別子の使用を検討してください。詳細については、多言語アナライザーまたは言語識別子を参照してください。

手順 2: 精度向上のためのフィルター追加

トークナイザーを選択したら、検索要件やコンテンツの特性に合わせてフィルターを適用します。

よく使われるフィルター

これらのフィルターは、スペース区切りの言語(英語、フランス語、ドイツ語、スペイン語など)のほとんどの構成に不可欠であり、検索品質を大幅に向上させます。

フィルター

仕組み

使用タイミング

lowercase

すべてのトークンを小文字に変換

汎用 - 大文字・小文字の区別があるすべての言語に適用

  • 入力: ["Apple", "iPhone"]

  • 出力: [['apple'], ['iphone']]

stemmer

単語を語根形式に還元

語形変化のある言語(英語、フランス語、ドイツ語など)

英語の場合:

  • 入力: ["running", "runs", "ran"]

  • 出力: [['run'], ['run'], ['ran']]

stop

一般的な無意味語を除去

ほとんどの言語 - 特にスペース区切りの言語で効果的

  • 入力: ["the", "quick", "brown", "fox"]

  • 出力: [[], ['quick'], ['brown'], ['fox']]

📘Notes

東アジア言語(中国語、日本語、韓国語など)の場合は、代わりに言語固有のフィルターに注目してください。これらの言語はテキスト処理のアプローチが異なるため、ステミングの効果が限定的な場合があります。

テキスト正規化フィルター

これらのフィルターはテキストの表記揺れを正規化し、マッチングの一貫性を高めます。

フィルター

動作の仕組み

使用場面

asciifolding

アクセント記号付き文字を ASCII 相当に変換

多言語コンテンツ、ユーザー生成コンテンツ

  • 入力: ["café", "naïve", "résumé"]

  • 出力: [['cafe'], ['naive'], ['resume']]

トークンフィルタリング

文字種別や長さに基づいて、保持するトークンを制御します。

フィルター

動作の仕組み

使用場面

removepunct

単独の句読点トークンを削除

jiebalinderaicu トークナイザーの出力をクリーンアップします。これらのトークナイザーは句読点を単一トークンとして返す場合があります。

  • 入力: ["Hello", "!", "world"]

  • 出力: [['Hello'], ['world']]

alphanumonly

英数字のみを保持

技術系コンテンツ、クリーンなテキスト処理

  • 入力: ["user123", "test@email.com"]

  • 出力: [['user123'], ['test', 'email', 'com']]

length

指定した長さ範囲外のトークンを削除

ノイズ(極端に長いトークンなど)を除去

  • 入力: ["a", "very", "extraordinarily"]

  • 出力: [['a'], ['very'], []]max=10 の場合)

regex

カスタムパターンによるフィルタリング

ドメイン固有のトークン要件に対応

  • 入力: ["test123", "prod456"]

  • 出力: [[], ['prod456']]expr="^prod" の場合)

言語固有のフィルター

これらのフィルターは、各言語に特有の特性を処理します。

フィルター

言語

動作の仕組み

decompounder

ドイツ語

複合語を検索可能な構成要素に分割

  • 入力: ["dampfschifffahrt"]

  • 出力: [['dampf', 'schiff', 'fahrt']]

cnalphanumonly

中国語

漢字と英数字を保持

  • 入力: ["Hello", "世界", "123", "!@#"]

  • 出力: [['Hello'], ['世界'], ['123'], []]

cncharonly

中国語

漢字のみを保持

  • 入力: ["Hello", "世界", "123"]

  • 出力: [[], ['世界'], []]

pinyin

中国語

中国語トークンのピンイン形式を出力

  • 入力: ["中文"]

  • 出力: [['中文', 'zhong', 'wen']]

ステップ3: 組み合わせて実装する

カスタムアナライザーを作成するには、analyzer_params ディクショナリでトークナイザーとフィルターのリストを定義します。フィルターはリスト順に適用されます。

python
# Example: A custom analyzer for technical content
analyzer_params = {
"tokenizer": "whitespace",
"filter": ["lowercase", "alphanumonly"]
}

# Applying analyzer config to target VARCHAR field in your collection schema
schema.add_field(
field_name='text',
datatype=DataType.VARCHAR,
max_length=200,
enable_analyzer=True,
analyzer_params=analyzer_params,
)

最後に: run_analyzer でテストする

コレクションに適用する前に、必ず設定を検証してください。

python
# Sample text to analyze
sample_text = "The Milvus vector database is built for scale!"

# Run analyzer with the defined configuration
result = client.run_analyzer(sample_text, analyzer_params)
print("Analyzer output:", result)

確認すべき一般的な問題:

  • 過剰トークン化: 技術用語が誤って分割される

  • トークン分割不足: フレーズが適切に分離されない

  • トークンの欠落: 重要な用語がフィルターで除外される

詳細な使用方法については、run_analyzer を参照してください。

ユースケース別のクイックレシピ

このセクションでは、Zilliz Cloud でアナライザーを使用する際の一般的なユースケース向けに、推奨されるトークナイザーとフィルターの構成を紹介します。コンテンツの種類と検索要件に最適な組み合わせを選択してください。

📘Notes

アナライザーをコレクションに適用する前に、run_analyzer を使用してテキスト解析のパフォーマンスをテスト・検証することを推奨します。

英語

json
analyzer_params = {
"tokenizer": "standard",
"filter": [
"lowercase",
{
"type": "stemmer",
"language": "english"
},
{
"type": "stop",
"stop_words": [
"_english_"
]
}
]
}

中国語

json
{
"tokenizer": "jieba",
"filter": ["cnalphanumonly"]
}

アラビア語

python
{
"tokenizer": "standard",
"filter": [
"lowercase",
{
"type": "stemmer",
"language": "arabic"
}
]
}

ベンガル語

python
{
"tokenizer": "icu",
"filter": ["lowercase", {
"type": "stop",
"stop_words": [<put stop words list here>]
}]
}

フランス語

json
{
"tokenizer": "standard",
"filter": [
"lowercase",
{
"type": "stemmer",
"language": "french"
},
{
"type": "stop",
"stop_words": [
"_french_"
]
}
]
}

ドイツ語

json
{
"tokenizer": {
"type": "lindera",
"dict_kind": "ipadic"
},
"filter": [
"removepunct"
]
}

ヒンディー語

json
{
"tokenizer": "icu",
"filter": ["lowercase", {
"type": "stop",
"stop_words": [<put stop words list here>]
}]
}

韓国語

json
{
"tokenizer": {
"type": "lindera",
"dict_kind": "ko-dic",
"filter": [
{
"kind": "korean_stop_tags",
"tags": ["SP", "SSC", "SSO", "SC", "SE", "SF", "JKS", "JKC", "JKG", "JKO", "JKB", "JKV", "JKQ", "JX", "JC", "UNK", "EP", "ETM"]
}
]
}
}

日本語

json
{
"tokenizer": {
"type": "lindera",
"dict_kind": "ipadic"
},
"filter": [
"removepunct"
]
}

ポルトガル語

json
{
"tokenizer": "standard",
"filter": [
"lowercase",
{
"type": "stemmer",
"language": "portuguese"
},
{
"type": "stop",
"stop_words": [
"_portuguese_"
]
}
]
}

ロシア語

json
{
"tokenizer": "standard",
"filter": [
"lowercase",
{
"type": "stemmer",
"language": "russian"
},
{
"type": "stop",
"stop_words": [
"_russian_"
]
}
]
}

スペイン語

json
{
"tokenizer": "standard",
"filter": [
"lowercase",
{
"type": "stemmer",
"language": "spanish"
},
{
"type": "stop",
"stop_words": [
"_spanish_"
]
}
]
}

スワヒリ語

json
{
"tokenizer": "standard",
"filter": ["lowercase", {
"type": "stop",
"stop_words": [<put stop words list here>]
}]
}

トルコ語

json
{
"tokenizer": "standard",
"filter": [
"lowercase",
{
"type": "stemmer",
"language": "turkish"
}
]
}

ウルドゥー語

json
{
"tokenizer": "icu",
"filter": ["lowercase", {
"type": "stop",
"stop_words": [<put stop words list here>]
}]
}

混合または多言語コンテンツ

複数の言語にまたがるコンテンツや、使用される文字体系が予測できないコンテンツを扱う場合は、まず icu アナライザーを使用してください。この Unicode 対応アナライザーは、混在する文字体系や記号を効果的に処理できます。

基本的な多言語設定(ステミングなし):

python
analyzer_params = {
"tokenizer": "icu",
"filter": ["lowercase", "asciifolding"]
}

高度な多言語処理:

言語ごとにトークンの挙動をより細かく制御するには、次の方法があります。

  • 多言語アナライザーの設定を使用します。詳細は「多言語アナライザー」を参照してください。

  • コンテンツに言語識別子を実装します。詳細は「言語識別子」を参照してください。

Zilliz Cloud でアナライザーを設定・プレビューする

Zilliz Cloud では、コードを書かずに Zilliz Cloud コンソール から直接テキストアナライザーの設定とテストを行えます。

Ctrl I