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

ユースケースに適した Analyzer を選ぶ

このガイドは、Zilliz Cloud でテキストコンテンツに最適な analyzer を選択して設定するのに役立ちます。

このガイドは 実践的な意思決定 に焦点を当てています。どの analyzer を使うべきか、いつカスタマイズすべきか、そして設定をどのように検証するかを説明します。analyzer のコンポーネントやパラメータの背景については、Analyzer Overview を参照してください。

クイックコンセプト: analyzer はどのように動作するか

analyzer は、全文検索(BM25 ベース)、phrase match、または text match などの機能で検索可能になるように、テキストデータを処理します。生のテキストを、2 段階のパイプラインを通じて、検索可能な離散トークンへ変換します。

JwMZwIYUwhbSZ4bjhxcc1PfNnvx

  1. Tokenization(必須): この初期段階では、tokenizer を適用して、連続したテキスト文字列を token と呼ばれる離散的で意味のある単位に分割します。tokenization の方法は、言語やコンテンツの種類に応じて大きく異なる場合があります。

  2. Token filtering(任意): tokenization の後、filter を適用して token を変更、削除、または精緻化します。これには、すべての token を小文字に変換する、一般的で意味の薄い単語(stopwords など)を除去する、あるいは単語を語幹形に還元する(stemming)といった処理が含まれます。

例:

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

analyzer の選択が重要な理由

選択する analyzer は、検索品質と関連性 に直接影響します。

不適切な analyzer は、tokenization の過不足、用語の取りこぼし、または無関係な結果を引き起こす可能性があります。

問題

症状

例(入力と出力)

原因(不適切な Analyzer)

解決策(適切な Analyzer)

過剰な tokenization

技術用語、識別子、URL が不適切に分割される

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

  • "C++"['c']

standard analyzer

whitespace tokenizer を使用し、alphanumonly filter と組み合わせます。

不十分な tokenization

複数単語からなるフレーズが 1 つの token として扱われる

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

whitespace tokenizer を持つ analyzer

句読点やスペースで分割する standard tokenizer を使用し、カスタムの regex filter を使います。

言語のミスマッチ

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

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

english analyzer

chinese のような言語特化型 analyzer を使用します。

入力方法のミスマッチ

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

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

漢字トークンのみを出力する analyzer

jieba tokenizer と pinyin filter を使ったカスタム analyzer を使用します。

ステップ 1: analyzer を選ぶ必要があるか?

テキスト検索機能(例: 全文検索phrase match、または text match)を使用しているが、analyzer を明示的に指定していない 場合、

Zilliz Cloud は自動的に standard analyzer を適用します。

Standard analyzer の動作:

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

  • すべての token を小文字に変換する

変換例:

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

ステップ 2: standard analyzer が要件を満たすか確認する

この表を使って、デフォルトの standard analyzer が要件を満たすかを素早く判断してください。満たさない場合は、別のパスを選択 する必要があります。

あなたのコンテンツStandard Analyzer で十分か?理由必要なもの
英語のブログ記事 はいデフォルトの動作で十分です。デフォルトを使用します(設定不要)。
中国語の文書 いいえ中国語の単語にはスペースがなく、1 つの token として扱われます。組み込みの chinese analyzer を使用します。
技術ドキュメント いいえC++ のような用語から句読点が削除されます。whitespace tokenizer と alphanumonly filter を使ったカスタム analyzer を作成します。
フランス語やスペイン語などスペース区切りの言語のテキスト⚠️ 場合によるアクセント付き文字(cafécafe など)が一致しない可能性があります。より良い結果のために、asciifolding を使ったカスタム analyzer を推奨します。
多言語または不明な言語 いいえstandard analyzer には、異なる文字セットや tokenization ルールを処理するために必要な言語固有のロジックがありません。Unicode 対応の tokenization のために icu tokenizer を使ったカスタム analyzer を使用します。
代わりに、多言語コンテンツをより正確に処理するために multi-language analyzers または language identifier の設定を検討してください。

ステップ 3: パスを選択する

デフォルトの standard analyzer で不十分な場合は、次の 2 つのパスのいずれかを選択します。

  • パス A – 組み込み analyzer を使用する(すぐに使える、言語特化型)

  • パス B – カスタム analyzer を作成する(tokenizer + filter セットを手動で定義)

パス A: 組み込み analyzer を使用する

組み込み analyzer は、一般的な言語向けに事前設定されたソリューションです。デフォルトの standard analyzer が完全には適合しない場合に、最も簡単に始められる方法です。

使用可能な組み込み analyzer

Analyzer

対応言語

コンポーネント

注記

standard

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

  • Tokenizer: standard

  • Filters: lowercase

初期のテキスト処理向けの汎用 analyzer です。単一言語のシナリオでは、言語特化型 analyzer(english など)の方がより良い性能を提供します。

english

英語専用で、英語の意味的なマッチングを改善するために stemming と stop word removal を適用します

  • Tokenizer: standard

  • Filters: lowercase, stemmer, stop

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

chinese

中国語

  • Tokenizer: jieba

  • Filters: cnalphanumonly

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

実装例

組み込み analyzer を使用するには、フィールドスキーマを定義する際に 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

詳細な使用方法については、Full Text SearchText Match、または Phrase Match を参照してください。

パス B: カスタム analyzer を作成する

組み込みオプション が要件を満たさない場合は、tokenizer と filter セットを組み合わせてカスタム analyzer を作成できます。これにより、テキスト処理パイプラインを完全に制御できます。

ステップ 1: 言語に基づいて tokenizer を選択する

コンテンツの主要言語に基づいて tokenizer を選択してください。

西洋言語

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

Tokenizer

仕組み

最適な用途

standard

スペースと句読点に基づいてテキストを分割します

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

  • Input: "Hello, world! Visit example.com"

  • Output: ['Hello', 'world', 'Visit', 'example', 'com']

whitespace

空白文字でのみ分割します

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

  • Input: "user_id = get_user_data()"

  • Output: ['user_id', '=', 'get_user_data()']

東アジア言語

辞書ベースの言語では、適切な単語分割のために専用 tokenizer が必要です。

中国語

Tokenizer

仕組み

最適な用途

jieba

インテリジェントアルゴリズムによる中国語の辞書ベース分割

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

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

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

lindera

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

jieba と比べて、より汎用的な方法で中国語テキストを処理します

  • Input: "机器学习算法"

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

日本語と韓国語

言語

Tokenizer

辞書オプション

最適な用途

日本語

lindera

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

固有名詞処理を含む形態素解析

  • Input: "東京都渋谷区"

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

韓国語

lindera

ko-dic

韓国語の形態素解析

  • Input: "안녕하세요"

  • Output: ["안녕", "하", "세요"]

多言語または不明な言語

文書内で言語が予測できない、または混在しているコンテンツの場合:

Tokenizer

仕組み

最適な用途

icu

Unicode 対応 tokenization(International Components for Unicode)

混在する文字体系、不明な言語、または単純な tokenization で十分な場合

  • Input: "Hello 世界 مرحبا"

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

icu を使用するタイミング:

  • 言語識別が現実的でない混在言語の場合。

  • multi-language analyzerslanguage identifier のオーバーヘッドを避けたい場合。

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

代替アプローチ: 多言語コンテンツをより正確に処理するには、multi-language analyzers または language identifier の使用を検討してください。詳細は、Multi-language Analyzers または Language Identifier を参照してください。

ステップ 2: 精度向上のために filter を追加する

tokenizer を選択した後、具体的な検索要件とコンテンツ特性に基づいて filter を適用します。

よく使われる filter

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

Filter

仕組み

使用するタイミング

lowercase

すべての token を小文字に変換します

普遍的 - 大文字・小文字の区別があるすべての言語に適用されます

  • Input: ["Apple", "iPhone"]

  • Output: [['apple'], ['iphone']]

stemmer

単語を語根形に還元します

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

英語の場合:

  • Input: ["running", "runs", "ran"]

  • Output: [['run'], ['run'], ['ran']]

stop

一般的で意味の薄い単語を削除します

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

  • Input: ["the", "quick", "brown", "fox"]

  • Output: [[], ['quick'], ['brown'], ['fox']]

📘Notes

東アジア言語(中国語、日本語、韓国語など)では、代わりに language-specific filters に重点を置いてください。これらの言語は通常、テキスト処理に異なるアプローチを使用し、stemming の恩恵を大きく受けない場合があります。

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

これらのフィルターは、テキストの表記ゆれを標準化して一致の一貫性を向上させます。

フィルター

仕組み

使用する場面

asciifolding

アクセント付き文字を ASCII の等価文字に変換

国際的なコンテンツ、ユーザー生成コンテンツ

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

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

トークンフィルタリング

文字内容または長さに基づいて、どのトークンを保持するかを制御します。

フィルター

仕組み

使用する場面

removepunct

独立した句読点トークンを削除

jiebalinderaicu tokenizer の出力をクリーンアップする場合。これらは句読点を単一トークンとして返します

  • 入力: ["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

中国語

中国語トークンに対して Pinyin 形式のトークンを生成

  • 入力: ["中文"]

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

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

カスタム analyzer を作成するには、analyzer_params 辞書内で tokenizer とフィルターのリストを定義します。フィルターは、記載された順序で適用されます。

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 でテストする

collection に適用する前に、必ず設定を検証してください。

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 で analyzer を使用する際の一般的なユースケース向けに、推奨される tokenizer とフィルターの構成を紹介します。コンテンツの種類と検索要件に最も適した組み合わせを選んでください。

📘注意

collection に analyzer を適用する前に、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 analyzer から始めてください。この Unicode 対応 analyzer は、混在する文字体系や記号を効果的に処理します。

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

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

高度な多言語処理:

異なる言語間でのトークンの動作をより細かく制御するには:

  • multi-language analyzer 構成を使用します。詳細については、Multi-language Analyzers を参照してください。

  • コンテンツに language identifier を実装します。詳細については、Language Identifier を参照してください。

Zilliz Cloud で analyzer を設定してプレビューする

Zilliz Cloud では、コードを書くことなく、Zilliz Cloudconsole から直接テキスト analyzer を設定してテストできます。

Ctrl I