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

テキストマッチ

Zilliz Cloud のテキストマッチを使用すると、特定の用語に基づいてドキュメントを正確に取得できます。この機能は主に、特定の条件を満たすためのフィルタリング検索に使用され、スカラーフィルタリングを組み合わせてクエリ結果を絞り込むことで、スカラー条件を満たすベクトル内での類似検索を可能にします。

📘Notes

TEXT_MATCH は分析済みの用語との完全一致を検出します。一方、TEXT_MATCH_FUZZY はクエリトークンとインデックス付きトークン間の小さな編集距離を許容できます。どちらもブールフィルタリング操作であり、一致したドキュメントの関連性はスコアリングしません。クエリ用語の意味や重要度に基づいて最も関連性の高いドキュメントを取得する場合は、全文検索 の使用をお勧めします。

Zilliz Cloud では、プログラムまたは Web コンソールからテキストマッチを有効にできます。このページでは、プログラムからテキストマッチを有効にする方法について説明します。Web コンソールでの操作の詳細については、コレクションの管理(コンソール) を参照してください。

概要​

Zilliz Cloud は Tantivy を統合し、基盤となる転置インデックスと用語ベースのテキスト検索を実現しています。Zilliz Cloud は、各テキストエントリを次の手順でインデックス化します。

  1. アナライザー: アナライザーは、入力テキストを個々の単語(トークン)に分割し、必要に応じてフィルターを適用することで処理します。これにより、Zilliz Cloud はこれらのトークンに基づいてインデックスを構築できます。

  2. インデックス作成: テキスト分析の後、Zilliz Cloud は各一意のトークンを、そのトークンを含むドキュメントに対応付ける転置インデックスを作成します。

ユーザーがテキストマッチを実行すると、転置インデックスを使用して、用語を含むすべてのドキュメントをすばやく取得します。これは、各ドキュメントを個別にスキャンするよりもはるかに高速です。

キーワードマッチ

テキストマッチを有効にする​

テキストマッチは、Zilliz Cloud の文字列データ型に相当する VARCHAR フィールド型で動作します。テキストマッチを有効にするには、コレクションスキーマを定義するときに enable_analyzer と enable_match の両方を True に設定したうえで、必要に応じてテキスト分析用のアナライザーを構成します。

enable_analyzer と enable_match を設定する​

特定の VARCHAR フィールドでテキストマッチを有効にするには、フィールドスキーマを定義する際に enable_analyzer と enable_match の両方のパラメーターを True に設定します。これにより、Zilliz Cloud はテキストをトークン化し、指定したフィールドの転置インデックスを作成するため、高速で効率的なテキストマッチが可能になります。

python
from pymilvus import MilvusClient, DataType

schema = MilvusClient.create_schema(enable_dynamic_field=False)
schema.add_field(
field_name="id",
datatype=DataType.INT64,
is_primary=True,
auto_id=True
)
schema.add_field(
field_name='text',
datatype=DataType.VARCHAR,
max_length=1000,
enable_analyzer=True, # Whether to enable text analysis for this field
enable_match=True # Whether to enable text match
)
schema.add_field(
field_name="embeddings",
datatype=DataType.FLOAT_VECTOR,
dim=5
)

オプション: アナライザーを構成する​

キーワードマッチングのパフォーマンスと精度は、選択したアナライザーによって異なります。アナライザーは言語やテキスト構造に合わせてそれぞれ設計されているため、適切なものを選択することが、特定のユースケースにおける検索結果に大きく影響します。

デフォルトでは、Zilliz Cloud は standard アナライザーを使用します。このアナライザーは、空白と句読点に基づいてテキストをトークン化し、40 文字を超えるトークンを削除し、テキストを小文字に変換します。このデフォルト設定を適用するために追加のパラメーターは必要ありません。詳細については、Standard を参照してください。

別のアナライザーが必要な場合は、analyzer_params パラメーターを使用して構成できます。たとえば、英語テキストを処理するために english アナライザーを適用するには、次のようにします。

python
analyzer_params = {
"type": "english"
}
schema.add_field(
field_name='text',
datatype=DataType.VARCHAR,
max_length=200,
enable_analyzer=True,
analyzer_params = analyzer_params,
enable_match = True,
)

Zilliz Cloud では、さまざまな言語やシナリオに適したその他のアナライザーも提供しています。詳細については、Analyzer Overview を参照してください。

テキストマッチを使用する​

コレクションスキーマで VARCHAR または TEXT フィールドのテキストマッチを有効にすると、TEXT_MATCH 式を使用してテキストマッチを実行できます。

TEXT_MATCH 式の構文​

TEXT_MATCH 式は、検索対象のフィールドと用語を指定するために使用します。その構文は次のとおりです。

python
TEXT_MATCH(field_name, text)
cpp
std::string filter = "TEXT_MATCH(field_name, text)";
bash
export filter="\"TEXT_MATCH(field_name, text)\""
  • field_name: 検索対象の、マッチングが有効な VARCHAR または TEXT フィールドの名前。

  • text: 検索する用語。複数の用語は、言語と構成したアナライザーに応じて、スペースまたはその他の適切な区切り文字で区切ることができます。

デフォルトでは、TEXT_MATCH は OR マッチングロジックを使用します。つまり、指定した用語のいずれかを含むドキュメントを返します。たとえば、text フィールドに machine または deep という用語を含むドキュメントを検索するには、次の式を使用します。

python
filter = "TEXT_MATCH(text, 'machine deep')"

論理演算子を使用して複数の TEXT_MATCH 式を組み合わせ、AND マッチングを実行することもできます。

  • text フィールドに machine と deep の両方を含むドキュメントを検索するには、次の式を使用します。
python
filter = "TEXT_MATCH(text, 'machine') and TEXT_MATCH(text, 'deep')"
  • text フィールドに machine と learning の両方を含み、deep を含まないドキュメントを検索するには、次の式を使用します。
python
filter = "not TEXT_MATCH(text, 'deep') and TEXT_MATCH(text, 'machine') and TEXT_MATCH(text, 'learning')"

TEXT_MATCH_FUZZY 式の構文​

Public Preview

TEXT_MATCH_FUZZY を使用すると、クエリトークンとインデックス付きトークン間のスペル差異を許容できます。Zilliz Cloud はフィールドのアナライザーでクエリテキストを分析し、得られた各トークンにファジーマッチングを適用します。クエリで複数のトークンが生成された場合、いずれかのトークンが設定された編集距離を満たすと、式はエンティティに一致します。

構文は次のとおりです。

python
TEXT_MATCH_FUZZY(field_name, text, max_edit_distance = 1)
cpp
std::string filter = "TEXT_MATCH_FUZZY(field_name, text, max_edit_distance = 1)";
bash
export filter="\"TEXT_MATCH_FUZZY(field_name, text, max_edit_distance = 1)\""
  • field_name: 検索対象の、マッチングが有効な VARCHAR または TEXT フィールドの名前。

  • text: 分析してインデックス付きトークンと照合するクエリテキスト。

  • max_edit_distance: 各クエリトークンに許可される最大編集距離。オプション名は厳密に max_edit_distance である必要があり、その値は 0、1、または 2 である必要があります。値 0 は完全なトークンマッチングを実行し、TEXT_MATCH と同等です。

たとえば、次の式は machne から 1 回の編集距離以内にあるトークン(machine を含む)に一致します。

python
filter = "TEXT_MATCH_FUZZY(text, 'machne', max_edit_distance = 1)"

TEXT_MATCH_FUZZY はフィルター式の構文の一部であるため、クライアント SDK に専用のファジーマッチメソッドは必要ありません。検索操作またはクエリ操作で TEXT_MATCH に使用する同じ filter パラメーターに式を渡します。

テキストマッチを使用して検索する​

テキストマッチは、ベクトル類似検索と組み合わせて検索範囲を絞り込み、検索パフォーマンスを向上させるために使用できます。ベクトル類似検索の前にテキストマッチでコレクションをフィルタリングすると、検索する必要があるドキュメントの数を減らすことができ、クエリ時間を短縮できます。

この例では、filter 式によって検索結果を、指定した用語 keyword1 または keyword2 に一致するドキュメントのみに絞り込みます。その後、このフィルタリングされたドキュメントのサブセットに対してベクトル類似検索を実行します。

📘Notes

テキストハイライターを構成すると、検索結果内の一致した用語をハイライトできます。詳細については、テキストハイライター を参照してください。

python
# Match entities with `keyword1` or `keyword2`
filter = "TEXT_MATCH(text, 'keyword1 keyword2')"

# Assuming 'embeddings' is the vector field and 'text' is the VARCHAR field
result = client.search(
collection_name="my_collection", # Your collection name
anns_field="embeddings", # Vector field name
data=[query_vector], # Query vector
filter=filter,
search_params={"params": {"nprobe": 10}},
limit=10, # Max. number of results to return
output_fields=["id", "text"] # Fields to return
)

テキストマッチを使用してクエリする​

テキストマッチは、クエリ操作でのスカラーフィルタリングにも使用できます。query() メソッドの expr パラメーターに TEXT_MATCH 式を指定すると、指定した用語に一致するドキュメントを取得できます。

次の例では、text フィールドに keyword1 と keyword2 の両方の用語を含むドキュメントを取得します。

python
# Match entities with both `keyword1` and `keyword2`
filter = "TEXT_MATCH(text, 'keyword1') and TEXT_MATCH(text, 'keyword2')"

result = client.query(
collection_name="my_collection",
filter=filter,
output_fields=["id", "text"]
)

考慮事項​

  • フィールドの用語マッチングを有効にすると、転置インデックスが作成され、ストレージリソースを消費します。この機能を有効にするかどうかを決定する際は、テキストサイズ、一意のトークン数、使用するアナライザーによってストレージへの影響が異なるため、ストレージへの影響を考慮してください。

  • スキーマでアナライザーを定義すると、その設定はそのコレクションに対して永続的になります。別のアナライザーの方がニーズに適していると判断した場合は、既存のコレクションを削除し、目的のアナライザー構成で新しいコレクションを作成することを検討してください。

  • filter 式のエスケープルール:

    • 式内の二重引用符または一重引用符で囲まれた文字は、文字列定数として解釈されます。文字列定数にエスケープ文字が含まれる場合、エスケープ文字はエスケープシーケンスで表す必要があります。たとえば、\ を表すには \\、タブ \t を表すには \\t、改行を表すには \\n を使用します。

    • 文字列定数が一重引用符で囲まれている場合、定数内の一重引用符は \\' と表し、二重引用符は " または \\" のいずれかで表すことができます。例: 'It\\'s milvus'。

    • 文字列定数が二重引用符で囲まれている場合、定数内の二重引用符は \\" と表し、一重引用符は ' または \\' のいずれかで表すことができます。例: "He said \\"Hi\\""。