メインコンテンツまでスキップ
バージョン: User Guides (Cloud)

ユースケースに合ったアナライザーの選び方

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

ここでは実用的な意思決定に焦点を当てています。具体的には、どのアナライザーを使用すべきか、いつカスタムアナライザーを作成すべきか、そして設定をどのように検証すべきかについて解説します。アナライザーの構成要素やパラメータに関する背景情報については、Analyzer Overview を参照してください。

クイックコンセプト:アナライザーの仕組み

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

JwMZwIYUwhbSZ4bjhxcc1PfNnvx

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

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

例:

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 のような言語固有のアナライザーを使用する。

ステップ 1: アナライザーを選択する必要があるか?

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

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

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

  • スペースおよび句読点でテキストを分割
  • すべてのトークンを小文字に変換

変換例:

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

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

次の表を使用して、デフォルトの standard アナライザー が要件を満たすかどうかを迅速に判断できます。満たさない場合は、別のパスを選択する必要があります。

コンテンツ

標準アナライザーで OK?

理由

必要な対応

英語のブログ記事

✅ はい

デフォルトの動作で十分です。

デフォルトを使用(設定不要)。

中国語のドキュメント

❌ いいえ

中国語の単語にはスペースがなく、1つのトークンとして扱われます。

組み込みの chinese アナライザーを使用してください。

技術ドキュメント

❌ いいえ

C++ のような用語から句読点が削除されます。

whitespace トークナイザーと alphanumonly フィルターを使用したカスタムアナライザーを作成してください。

フランス語やスペイン語など、スペース区切りの言語のテキスト

⚠️ おそらく

アクセント付き文字(cafécafe)が一致しない可能性があります。

より良い結果を得るには、asciifolding フィルターを使用したカスタムアナライザーを推奨します。

多言語または言語が不明なコンテンツ

❌ いいえ

standard アナライザーには、異なる文字セットやトークン化ルールを処理するために必要な言語固有のロジックがありません。

Unicode 対応のトークン化を行うには、icu トークナイザーを使用したカスタムアナライザーを使用してください。

あるいは、多言語コンテンツをより正確に処理するために、多言語アナライザーまたは言語識別子の構成を検討してください。

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

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

  • パス A – 組み込みアナライザーを使用(すぐに使える、言語固有のアナライザー)

  • パス B – カスタムアナライザーを作成(トークナイザーとフィルターのセットを手動で定義)

パス A: 組み込みアナライザーを使用する

組み込みアナライザーは、一般的な言語向けに事前設定されたソリューションです。デフォルトの standard analyzer が完全に適合しない場合でも、簡単に導入できます。

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

アナライザー

言語サポート

コンポーネント

備考

standard

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

  • トークナイザー: standard

  • フィルター: lowercase

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

english

英語専用で、ステミングとストップワード除去を適用し、英語の意味的マッチングを向上

  • トークナイザー: standard

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

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

chinese

中国語

  • トークナイザー: jieba

  • フィルター: cnalphanumonly

現在は簡体字中国語辞書がデフォルトで使用されています。

実装例

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

# 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

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

Path B: Create a custom analyzer

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

Step 1: Select the tokenizer based on language

コンテンツの主要な言語に基づいてトークナイザーを選択します:

Western languages

スペース区切りの言語の場合、以下のオプションがあります:

トークナイザー

How It Works

Best For

Examples

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()']

East Asian languages

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

Chinese

トークナイザー

How It Works

Best For

Examples

jieba

中国語辞書に基づく分割とインテリジェントアルゴリズム

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

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

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

lindera

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

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

  • Input: "机器学习算法"

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

Japanese and Korean

言語

トークナイザー

Dictionary Options

Best For

Examples

Japanese

lindera

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

固有名詞処理を伴う形態素解析

  • Input: "東京都渋谷区"

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

Korean

lindera

ko-dic

韓国語の形態素解析

  • Input: "안녕하세요"

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

Multilingual or unknown languages

言語が予測できない場合や、ドキュメント内で混合されているコンテンツの場合:

トークナイザー

How It Works

Best For

Examples

icu

Unicode 対応のトークン化(International Components for Unicode)

混合スクリプト、不明な言語、または単純なトークン化で十分な場合

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

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

icuを使用する場合:

  • 言語識別が実用的でない混合言語。

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

  • コンテンツに主要な言語があり、全体の意味にほとんど寄与しない外国語の単語が散在している場合(例:日本語やフランス語のブランド名や専門用語が散在する英語テキスト)。

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

Step 2: Add filters for precision

トークナイザーを選択 した後、特定の検索要件とコンテンツの特性に基づいてフィルターを適用します。

Commonly used filters

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

Filter

How It Works

When to Use

Examples

lowercase

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

ユニバーサル - 大文字小文字の区別があるすべての言語に適用されます

  • 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

東アジア言語(中国語、日本語、韓国語など)の場合は、代わりに言語固有のフィルターに焦点を当ててください。これらの言語は通常、テキスト処理に異なるアプローチを使用しており、ステミングから大きな恩恵を受けない可能性があります。

Text normalization filters

これらのフィルターは、テキストの変異を標準化し、マッチングの一貫性を向上させます:

Filter

How It Works

When to Use

Examples

asciifolding

アクセント付き文字を ASCII 相当文字に変換します

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

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

  • Output: [['cafe'], ['naive'], ['resume']]

Token filtering

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

Filter

How It Works

When to Use

Examples

removepunct

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

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

  • Input: ["Hello", "!", "world"]

  • Output: [['Hello'], ['world']]

alphanumonly

文字と数字のみを保持します

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

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

  • Output: [['user123'], ['test', 'email', 'com']]

length

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

ノイズのフィルタリング(過度に長いトークン)

  • Input: ["a", "very", "extraordinarily"]

  • Output: [['a'], ['very'], []] (max=10 の場合)

regex

カスタムパターンベースのフィルタリング

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

  • Input: ["test123", "prod456"]

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

言語-specific filters

これらのフィルターは、特定の言語の特性を処理します:

Filter

言語

How It Works

Examples

decompounder

German

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

  • Input: ["dampfschifffahrt"]

  • Output: [['dampf', 'schiff', 'fahrt']]

cnalphanumonly

Chinese

中国語文字 + 英数字を保持します

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

  • Output: [['Hello'], ['世界'], ['123'], []]

cncharonly

Chinese

中国語文字のみを保持します

  • Input: ["Hello", "世界", "123"]

  • Output: [[], ['世界'], []]

Step 3: Combine and implement

カスタムアナライザーを作成するには、analyzer_params 辞書でトークナイザーとフィルターの一覧を定義します。フィルターはリストされている順序で適用されます。

# 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 でのテスト

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

# 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 を参照してください。

Quick recipes by use case

このセクションでは、Zilliz Cloud でアナライザーを使用する際の一般的なユースケースに対応した、推奨されるトークナイザーとフィルターの設定を提供します。コンテンツタイプと検索要件に最も適した組み合わせを選択してください。

📘Notes

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

English

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

中国語

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

アラビア語

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

ベンガル語

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

フランス語

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

ドイツ語

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

हिन्दी

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

韓国語

{
"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"]
}
]
}
}

Japanese

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

ポルトガル語{#portuguese}

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

ロシア語

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

スペイン語

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

スワヒリ語

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

トルコ語

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

Urdu

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

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

複数の言語にまたがるコンテンツや、スクリプトが予測不能に使用されるコンテンツを扱う場合は、icu アナライザーから開始してください。この Unicode 対応アナライザーは、混合スクリプトや記号を効果的に処理します。

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

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

高度な多言語処理:

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

  • 多言語アナライザー構成を使用します。詳細については、多言語アナライザー を参照してください。

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

Zilliz Cloud でのアナライザーの構成とプレビュー

Zilliz Cloud では、コードを書かずに Zilliz Cloudコンソール から直接テキストアナライザーを構成してテストできます。