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

アナライザーの概要

テキスト処理において、アナライザーは生のテキストを構造化された検索可能な形式に変換する重要なコンポーネントです。各アナライザーは通常、トークナイザーとフィルターという 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 フィールド:

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

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

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

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

    • 検証: 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 が提供するテキスト検索機能と統合できます。詳細については、次を参照してください。