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

アナライザーの概要

テキスト処理において、アナライザーは生のテキストを構造化された検索可能な形式に変換する重要なコンポーネントです。各アナライザーは通常、トークナイザーとフィルターという 2 つの中核要素で構成されます。これらが連携して入力テキストをトークンに変換し、それらのトークンを洗練して、効率的なインデックス作成と検索に備えます。

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

Notes

アナライザーを使用すると、パフォーマンスに影響する可能性があります。

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

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

アナライザーの構造​

Zilliz Cloud のアナライザーは、正確に 1 つの トークナイザー と 0 個以上 のフィルターで構成されます。

  • トークナイザー: トークナイザーは、入力テキストをトークンと呼ばれる個別の単位に分割します。これらのトークンは、トークナイザーの種類に応じて単語またはフレーズになります。

  • フィルター: フィルターをトークンに適用すると、たとえば小文字への変換や一般的な単語の削除など、トークンをさらに洗練できます。

Notes

トークナイザーは UTF-8 形式のみをサポートしています。他の形式のサポートは、今後のリリースで追加される予定です。

以下のワークフローは、アナライザーがテキストを処理する流れを示しています。

Ke6jw8437hjR8hbZCvEcQtIIn1e

アナライザーの種類​

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

  • 組み込みアナライザー: 最小限のセットアップで一般的なテキスト処理タスクをカバーする、事前定義された構成です。組み込みアナライザーは複雑な構成が不要なため、汎用的な検索に最適です。

  • カスタムアナライザー: より高度な要件には、カスタムアナライザーを使用して、トークナイザーと 0 個以上のフィルターの両方を指定することで独自の構成を定義できます。このカスタマイズ性は、テキスト処理を精密に制御する必要がある特殊なユースケースに特に役立ちます。

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

  • 最適な検索およびクエリのパフォーマンスを得るには、テキストデータの言語に合ったアナライザーを選択してください。たとえば、standard アナライザーは汎用性が高いものの、中国語、日本語、韓国語のように独自の文法構造を持つ言語には最適でない場合があります。そのような場合は、chinese のような言語固有のアナライザーや、専用のトークナイザー(lindera、icu など)とフィルターを組み合わせたカスタムアナライザーの使用を強く推奨します。これにより、正確なトークン化とより良い検索結果が得られます。

組み込みアナライザー​

Zilliz Cloud クラスターの組み込みアナライザーは、特定のトークナイザーとフィルターが事前構成されているため、これらのコンポーネントを自分で定義することなくすぐに使用できます。各組み込みアナライザーは、プリセットのトークナイザーとフィルターを含むテンプレートとして機能し、カスタマイズ用のオプションパラメーターを備えています。

たとえば、standard 組み込みアナライザーを使用するには、その名前 standard を type として指定し、必要に応じて stop_words など、このアナライザータイプに固有の追加構成を含めます。

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
}

アナライザーの実行結果を確認するには、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']

これは、アナライザーがストップワード "a"、"an"、"for" を除外しつつ、残りの意味のあるトークンを返すことで、入力テキストを適切にトークン化していることを示しています。

上記の standard 組み込みアナライザーの構成は、以下のパラメーターで カスタムアナライザー を設定する場合と同等です。ここでは、同様の機能を実現するために tokenizer と filter のオプションを明示的に定義しています。

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

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

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

  • english: 英語のストップワードをサポートする、英語テキストに最適化されたアナライザーです。

  • chinese: 中国語の言語構造に適応したトークン化を含む、中国語テキストの処理に特化したアナライザーです。

カスタムアナライザー​

より高度なテキスト処理のために、Zilliz Cloud のカスタムアナライザーでは、トークナイザーとフィルターの両方を指定して、目的に合わせたテキスト処理パイプラインを構築できます。この構成は、精密な制御が求められる特殊なユースケースに最適です。

トークナイザー​

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

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

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

トークナイザーの指定例:

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

フィルター​

フィルターは、トークナイザーが生成したトークンに対して動作するオプションのコンポーネントで、必要に応じてトークンを変換または洗練します。たとえば、トークン化された用語 ["Vector", "Database", "Built", "for", "Scale"] に lowercase フィルターを適用すると、結果は次のようになります。

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

カスタムアナライザーのフィルターは、構成のニーズに応じて組み込みまたはカスタムのいずれかになります。

  • 組み込みフィルター: Zilliz Cloud によって事前構成されており、最小限のセットアップで済みます。名前を指定するだけで、これらのフィルターをそのまま使用できます。以下のフィルターはそのまま使用できる組み込みフィルターです。

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

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

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

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

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

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

組み込みフィルターの使用例:

python
analyzer_params = {
"tokenizer": "standard", # Mandatory: Specifies tokenizer
"filter": ["lowercase"], # Optional: Built-in filter that converts text to lowercase
}
  • カスタムフィルター: カスタムフィルターでは、特殊な構成が可能です。有効なフィルタータイプ(filter.type)を選択し、フィルタータイプごとに固有の設定を追加することで、カスタムフィルターを定義できます。カスタマイズをサポートするフィルタータイプの例は次のとおりです。

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

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

    • stemmer: 単語を語幹の形に還元し、より柔軟なマッチングを可能にします。詳細については、Stemmer を参照してください。

カスタムフィルターの構成例:

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 フィールド:

    • 1 つのフィールドは組み込みアナライザーを使用します。

    • もう 1 つはカスタムアナライザーを使用します。

これらの構成をコレクションに組み込む前に、run_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: アナライザーの構成を定義して検証する​

  1. 組み込みアナライザー(english)の構成と検証:

    • 構成: 組み込みの英語アナライザーのパラメーターを定義します。

    • 検証: 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. カスタムアナライザーの構成と検証:

    • 構成: 標準のトークナイザーに加えて、組み込みの lowercase フィルターと、トークン長およびストップワード用のカスタムフィルターを使用するカスタムアナライザーを定義します。

    • 検証: 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: スキーマフィールドにアナライザーを追加する​

アナライザーの構成を検証したら、それらをスキーマフィールドに追加します。

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

アナライザーの構成は、コレクションの作成後に変更できません。アナライザーの構成を変更するには、目的の設定で新しいコレクションを作成し、データを 移行 します。

次のステップ​

アナライザーを構成する際は、以下のベストプラクティス記事を読んで、ユースケースに最適な構成を判断することをおすすめします。

アナライザーを構成したら、Zilliz Cloud が提供するテキスト検索機能と統合できます。詳細については、以下を参照してください。