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

Analyzer の概要

テキスト処理において、analyzer は生のテキストを構造化された検索可能な形式に変換する重要なコンポーネントです。各 analyzer は通常、tokenizerfilter という 2 つの主要な要素で構成されます。これらが連携して入力テキストをトークンに変換・加工し、効率的なインデックス作成と検索に備えます。

Zilliz Cloud では、analyzer はコレクション作成時にコレクションスキーマへ VARCHAR フィールドを追加する際に設定されます。analyzer によって生成されたトークンは、キーワードマッチング用のインデックス構築や、全文検索用のスパース埋め込みへの変換に使用できます。詳細については、全文検索 または テキストマッチ を参照してください。

📘Notes

analyzer の使用はパフォーマンスに影響を与える可能性があります。

  • 全文検索: 全文検索では、DataNodeQueryNode のチャネルがトークン化の完了を待つ必要があるため、データの消費速度が低下します。その結果、新しく取り込まれたデータが検索可能になるまでに時間がかかります。

  • キーワードマッチ: キーワードマッチングでも、インデックス構築の前にトークン化を完了する必要があるため、インデックス作成に時間がかかります。

analyzer の構造

Zilliz Cloud の analyzer は、必ず 1 つの tokenizer0 個以上の filter で構成されます。

  • Tokenizer: tokenizer は入力テキストをトークンと呼ばれる個別の単位に分割します。生成されるトークンは単語やフレーズなど、tokenizer の種類によって異なります。

  • Filters: filter を適用することで、トークンの小文字化や一般的な単語の除去など、トークンをさらに加工できます。

📘Notes

tokenizer がサポートするのは UTF-8 形式のみです。その他の形式への対応は今後のリリースで追加される予定です。

以下のワークフローは、analyzer によるテキスト処理の流れを示しています。

Ke6jw8437hjR8hbZCvEcQtIIn1e

analyzer の種類

Zilliz Cloud は、さまざまなテキスト処理ニーズに対応するため、2 種類の analyzer を提供しています。

  • 組み込み analyzer: 最小限の設定で一般的なテキスト処理タスクをカバーする事前定義済みの構成です。複雑な設定が不要なため、汎用的な検索に最適です。

  • カスタム analyzer: より高度な要件には、tokenizer と 0 個以上の filter の両方を指定して独自の構成を定義できます。このカスタマイズは、テキスト処理を細かく制御する必要がある特殊なユースケースで特に有効です。

📘Notes
  • コレクション作成時に analyzer の設定を省略した場合、Zilliz Cloud はデフォルトで standard analyzer をすべてのテキスト処理に使用します。詳細については、Standard を参照してください。

  • 最適な検索およびクエリパフォーマンスを得るには、テキストデータの言語に適した analyzer を選択してください。たとえば、standard analyzer は汎用性が高いものの、中国語、日本語、韓国語など独自の文法構造を持つ言語には不向きな場合があります。このような場合は、正確なトークン化と検索精度の向上のため、chinese のような言語固有の analyzer や、専用の tokenizer(linderaicu など)と filter を組み合わせたカスタム analyzer の使用を強く推奨します。

組み込み analyzer

Zilliz Cloud クラスターの組み込み analyzer には、特定の tokenizer と filter が事前に設定されているため、これらのコンポーネントを自分で定義しなくてもすぐに利用できます。各組み込み analyzer は、プリセットの tokenizer と filter を含むテンプレートとして機能し、カスタマイズ用のオプションパラメーターも用意されています。

たとえば、standard 組み込み analyzer を使用するには、その名前 standardtype として指定するだけで済みます。必要に応じて、stop_words など、この analyzer タイプ固有の追加設定を含めることもできます。

python
analyzer_params = {
"type": "standard", # Uses the standard built-in analyzer
"stop_words": ["a", "an", "for"] # Defines a list of common words (stop words) to exclude from tokenization
}

analyzer の実行結果を確認するには、run_analyzer メソッドを使用します。

python
# Sample text to analyze
text = "An efficient system relies on a robust analyzer to correctly process text for various applications."

# Run analyzer
result = client.run_analyzer(
text,
analyzer_params
)

出力は以下のようになります。

sql
['efficient', 'system', 'relies', 'on', 'robust', 'analyzer', 'to', 'correctly', 'process', 'text', 'various', 'applications']

この結果は、analyzer がストップワードである "a""an""for" を除外して入力テキストを適切にトークン化し、意味のあるトークンのみを返していることを示しています。

上記の standard 組み込み analyzer の設定は、カスタム analyzer を以下のパラメーターで構築する場合と同等です。ここでは、同様の機能を実現するために tokenizerfilter のオプションが明示的に定義されています。

python
analyzer_params = {
"tokenizer": "standard",
"filter": [
"lowercase",
{
"type": "stop",
"stop_words": ["a", "an", "for"]
}
]
}

Zilliz Cloud では、それぞれ特定のテキスト処理ニーズに合わせて設計された以下の組み込み analyzer を提供しています。

  • standard: 標準的なトークン化と小文字化フィルタリングを適用する、汎用的なテキスト処理に適しています。

  • english: 英語のストップワードに対応しており、英語テキストの処理に最適化されています。

  • chinese: 中国語の言語構造に適したトークン化など、中国語テキストの処理に特化しています。

カスタム analyzer

より高度なテキスト処理を行う場合、Zilliz Cloud のカスタム analyzer を使用すると、tokenizerfilters の両方を指定して、目的に合わせたテキスト処理パイプラインを構築できます。この構成は、細かな制御が求められる特殊なユースケースに最適です。

Tokenizer

tokenizer はカスタム analyzer に必須のコンポーネントであり、入力テキストを個別の単位(トークン)に分割して analyzer パイプラインを開始します。トークン化は、tokenizer の種類に応じて、空白や句読点で区切るなど特定のルールに従って行われます。この処理により、各単語やフレーズをより精密かつ独立して扱えるようになります。

たとえば、tokenizer はテキスト "Vector Database Built for Scale" を個別のトークンに変換します。

plaintext
["Vector", "Database", "Built", "for", "Scale"]

tokenizer の指定例:

python
analyzer_params = {
"tokenizer": "whitespace",
}

Filter

filter は、tokenizer が生成したトークンを処理するオプションのコンポーネントであり、必要に応じてトークンの変換や調整を行います。たとえば、トークン化された語句 ["Vector", "Database", "Built", "for", "Scale"]lowercase filter を適用すると、結果は以下のようになります。

sql
["vector", "database", "built", "for", "scale"]

カスタム analyzer で使用できる filter には、設定のニーズに応じて組み込みまたはカスタムのものがあります。

  • 組み込み filter: Zilliz Cloud によって事前設定されており、最小限のセットアップで利用できます。名前を指定するだけでそのまま使用でき、以下はそのまま使用できる組み込みの filter です。

    • lowercase: テキストを小文字に変換し、大文字・小文字を区別しないマッチングを実現します。詳細は Lowercase を参照してください。

    • asciifolding: 非 ASCII 文字を対応する ASCII 文字に変換し、多言語テキストの処理を簡素化します。詳細は ASCII folding を参照してください。

    • alphanumonly: 英数字以外の文字を除去し、英数字のみを保持します。詳細は Alphanumonly を参照してください。

    • cnalphanumonly: 中国語文字、英字、数字以外の文字を含むトークンを削除します。詳細は Cnalphanumonly を参照してください。

    • cncharonly: 中国語以外の文字を含むトークンを削除します。詳細は Cncharonly を参照してください。

    • pinyin: 中国語トークンにピンイン表記を追加し、ピンインによる中国語テキストのマッチングを可能にします。詳細は Pinyin を参照してください。

    組み込み filter の使用例:

    python
    analyzer_params = {
    "tokenizer": "standard", # Mandatory: Specifies tokenizer
    "filter": ["lowercase"], # Optional: Built-in filter that converts text to lowercase
    }
  • カスタム filter: カスタム filter では独自の設定が可能です。有効な filter タイプ(filter.type)を選択し、各タイプに応じた設定を追加することで定義できます。カスタマイズ可能な filter タイプの例は以下のとおりです。

    • stop: ストップワードリスト(例: "stop_words": ["of", "to"])を設定し、指定された一般的な単語を削除します。詳細は Stop を参照してください。

    • length: トークンの最大長など、長さの条件に基づいてトークンを除外します。詳細は Length を参照してください。

    • stemmer: 単語を語幹に還元し、柔軟なマッチングを実現します。詳細は Stemmer を参照してください。

    カスタム filter の設定例:

    python
    analyzer_params = {
    "tokenizer": "standard", # Mandatory: Specifies tokenizer
    "filter": [
    {
    "type": "stop", # Specifies 'stop' as the filter type
    "stop_words": ["of", "to"], # Customizes stop words for this filter type
    }
    ]
    }

使用例

この例では、以下を含むコレクションスキーマを作成します。

  • 埋め込み用のベクトルフィールド。

  • テキスト処理用の 2 つの VARCHAR フィールド:

    • 一方のフィールドは組み込み analyzer を使用します。

    • もう一方のフィールドはカスタム analyzer を使用します。

これらの設定をコレクションに適用する前に、run_analyzer メソッドを使って各 analyzer を検証します。

ステップ 1: MilvusClient の初期化とスキーマの作成

まず、Milvus クライアントをセットアップし、新しいスキーマを作成します。

python
from pymilvus import MilvusClient, DataType

# Set up a Milvus client
client = MilvusClient(
uri="YOUR_CLUSTER_ENDPOINT"
token="YOUR_CLUSTER_TOKEN"
)

# Create a new schema
schema = client.create_schema(auto_id=True, enable_dynamic_field=False)

ステップ 2: analyzer 設定の定義と検証

  1. 組み込み analyzer の設定と検証 (english):

    • 設定: 組み込みの英語 analyzer のパラメーターを定義します。

    • 検証: run_analyzer を使用して、設定により期待どおりのトークン化が得られることを確認します。

    python
    # Built-in analyzer configuration for English text processing
    analyzer_params_built_in = {
    "type": "english"
    }
    # Verify built-in analyzer configuration
    sample_text = "Milvus simplifies text analysis for search."
    result = client.run_analyzer(sample_text, analyzer_params_built_in)
    print("Built-in analyzer output:", result)

    # Expected output:
    # Built-in analyzer output: ['milvus', 'simplifi', 'text', 'analysi', 'search']
  2. カスタム analyzer の設定と検証:

    • 設定: 標準 tokenizer に加え、組み込みの小文字化 filter およびトークン長・ストップワード用のカスタム filter を使用するカスタム analyzer を定義します。

    • 検証: run_analyzer を使用して、カスタム設定が意図どおりにテキストを処理することを確認します。

    python
    # Custom analyzer configuration with a standard tokenizer and custom filters
    analyzer_params_custom = {
    "tokenizer": "standard",
    "filter": [
    "lowercase", # Built-in filter: convert tokens to lowercase
    {
    "type": "length", # Custom filter: restrict token length
    "max": 40
    },
    {
    "type": "stop", # Custom filter: remove specified stop words
    "stop_words": ["of", "for"]
    }
    ]
    }

    # Verify custom analyzer configuration
    sample_text = "Milvus provides flexible, customizable analyzers for robust text processing."
    result = client.run_analyzer(sample_text, analyzer_params_custom)
    print("Custom analyzer output:", result)

    # Expected output:
    # Custom analyzer output: ['milvus', 'provides', 'flexible', 'customizable', 'analyzers', 'robust', 'text', 'processing']

ステップ 3: スキーマフィールドに analyzer を追加する

analyzer 設定の検証が完了したら、スキーマフィールドに追加します。

python
# Add VARCHAR field 'title_en' using the built-in analyzer configuration
schema.add_field(
field_name='title_en',
datatype=DataType.VARCHAR,
max_length=1000,
enable_analyzer=True,
analyzer_params=analyzer_params_built_in,
enable_match=True,
)

# Add VARCHAR field 'title' using the custom analyzer configuration
schema.add_field(
field_name='title',
datatype=DataType.VARCHAR,
max_length=1000,
enable_analyzer=True,
analyzer_params=analyzer_params_custom,
enable_match=True,
)

# Add a vector field for embeddings
schema.add_field(field_name="embedding", datatype=DataType.FLOAT_VECTOR, dim=3)

# Add a primary key field
schema.add_field(field_name="id", datatype=DataType.INT64, is_primary=True)

ステップ 4: インデックスパラメーターの準備とコレクションの作成

python
# Set up index parameters for the vector field
index_params = client.prepare_index_params()
index_params.add_index(field_name="embedding", metric_type="COSINE", index_type="AUTOINDEX")

# Create the collection with the defined schema and index parameters
client.create_collection(
collection_name="my_collection",
schema=schema,
index_params=index_params
)

Zilliz Cloud コンソールでの使用例

上記の操作は、Zilliz Cloud コンソールでも実行できます。詳しくは以下のデモをご覧ください。

📘Note

analyzer の設定は、コレクションの作成後は変更できません。設定を変更する場合は、目的の設定で新しいコレクションを作成し、データを移行してください。

次のステップ

analyzer を設定する際は、ユースケースに最適な構成を検討するため、以下のベストプラクティス記事をご参照ください。

analyzer の設定後、Zilliz Cloud が提供するテキスト検索機能を利用できます。詳細については以下をご覧ください。