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

アナライザーの概要

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

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

📘Notes

アナライザーの使用はパフォーマンスに影響を与える可能性があります:

  • 全文検索: 全文検索の場合、データNodeおよびQueryNodeチャネルはトークン化が完了するまで待機しなければならないため、データの消費速度が遅くなります。その結果、新しく取り込まれたデータが検索可能になるまでに時間がかかります。

  • キーワードマッチ: キーワードマッチの場合も、トークン化が完了してからでないとインデックスを作成できないため、インデックス作成が遅くなります。

アナライザーの構成

Zilliz Cloudにおけるアナライザーは、ちょうど1つトークナイザーゼロ個以上のフィルターで構成されます。

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

  • フィルター: フィルターはトークンに適用され、小文字化や一般的な単語の除去など、トークンをさらに洗練させるために使用されます。

📘Notes

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

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

Ke6jw8437hjR8hbZCvEcQtIIn1e

アナライザーの種類

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

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

  • カスタムアナライザー: より高度な要件に対しては、カスタムアナライザーを使用することで、トークナイザーとゼロ個以上のフィルターを自分で指定した独自の設定を定義できます。このレベルのカスタマイズは、テキスト処理をきめ細かく制御する必要がある特殊なユースケースに特に役立ちます。

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

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

組み込みアナライザー

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

たとえば、standard組み込みアナライザーを使用するには、その名前standardtypeとして指定し、必要に応じてこのアナライザー固有の追加設定(例: stop_words)を含めるだけです。

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 メソッドを使用します:

# 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
)

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

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

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

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

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

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

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

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

  • chinese: 中国語テキストの処理に特化しており、中国語の言語構造に合わせたトークン化を含みます。

カスタムアナライザー

より高度なテキスト処理を行うには、Zilliz Cloud のカスタムアナライザーを使用して、トークナイザーフィルターを指定することで、用途に合わせたテキスト処理パイプラインを構築できます。この設定は、細やかな制御が必要な特殊なユースケースに最適です。

トークナイザー

トークナイザーはカスタムアナライザーに必須のコンポーネントであり、入力テキストを個別の単位(トークン)に分割することでアナライザーパイプラインを開始します。トークン化は、ホワイトスペースや句読点による分割など、トークナイザーの種類に応じた特定のルールに従って行われます。これにより、各単語やフレーズをより正確かつ独立的に処理できます。

例えば、トークナイザーはテキスト "Vector データベース Built for Scale" を以下のような個別のトークンに変換します:

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

トークナイザーを指定する例:

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

Filter

フィルターはトークナイザーによって生成されたトークンに対して機能するオプションのコンポーネントであり、必要に応じてそれらを変換または精製します。たとえば、トークン化された語 ["Vector", "データベース", "Built", "for", "Scale"]lowercase フィルターを適用すると、結果は次のようになります:

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

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

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

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

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

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

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

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

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

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

    カスタムフィルターの設定例:

    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
    }
    ]
    }
nlohmann::json analyzer_params = {
{"type", "standard"},
{"filter", {{{"type", "stop"}, {"stop_words", {"a", "an", "for"}}}}},
};

使用例

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

  • 埋め込み(embeddings)用のベクトルフィールド。
  • テキスト処理用の2つの VARCHAR フィールド:
    • 1つのフィールドは組み込みアナライザーを使用します。
    • もう1つのフィールドはカスタムアナライザーを使用します。

これらの設定をコレクションに組み込む前に、run_analyzer メソッドを使って各アナライザーを検証します。

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

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

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 を使用して、設定が期待されるトークン化を生成することを確認します。

    # 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 を使用して、カスタム設定が意図通りにテキストを処理することを確認します。

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

アナライザーの設定を確認できたので、スキーマフィールドにそれらを追加します:

# 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: インデックスパラメータを準備してコレクションを作成する

# 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 コンソールからも実行できます。詳細については、以下のデモをご覧ください。

次のステップ

アナライザーを設定する際には、ユースケースに最も適した設定を決定するために、以下のベストプラクティス記事をお読みいただくことをおすすめします。

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