ペイロード

Qdrantの重要な機能の1つは、ベクトルの外部に追加情報を保存できる能力です(ストレージ管理業務属性)。Qdrantの用語では、この追加情報を「ペイロード」と呼びます。

Qdrantを使用すると、JSONを使用して表現できる任意の情報を保存できます。

以下は典型的なペイロードの例です:

{
    "name": "jacket",
    "color": ["red", "blue"],
    "quantity": 10,
    "price": 11.99,
    "location": [
        {
            "longitude": 52.5200,
            "latitude": 13.4050
        }
    ],
    "reviews": [
        {
            "user": "Alice",
            "score": 4
        },
        {
            "user": "Bob",
            "score": 5
        }
    ]
}

ペイロードの種類

ペイロードの保存に加えて、Qdrantは特定の種類の値に基づいて検索することも可能です。この機能は検索プロセス中の追加フィルターとして実装されており、意味の類似性の上にカスタムロジックを組み込むことができます。

フィルタリングプロセス中、Qdrantはフィルタ条件を満たす値の条件をチェックします。保存された値の種類がフィルタ条件を満たさない場合、不適格と見なされます。

例えば、文字列データに範囲条件を適用すると空の出力になります。

ただし、配列(同じタイプの複数の値)の処理はわずかに異なります。配列にフィルタを適用する場合、配列中の少なくとも1つの値が条件を満たしている場合、フィルタが成功します。

フィルタリングプロセスの詳細な議論は、フィルタリングセクションで実施されます。

Qdrantでサポートされているデータタイプを見てみましょう:

整数

integer - -9223372036854775808 から 9223372036854775807 までの範囲を持つ64ビット整数。

単一および複数の integer 値の例:

{
    "quantity": 10,
    "sizes": [35, 36, 38]
}

浮動小数点

float - 64ビット浮動小数点数。

単一および複数の float 値の例:

{
    "price": 11.99,
    "rating": [9.1, 9.2, 9.4]
}

ブール

bool - 2進値。true または false に等しい。

単一および複数の bool 値の例:

{
    "delivered": true,
    "replies": [false, false, true, false]
}

キーワード

keyword - 文字列値。

単一および複数の keyword 値の例:

{
    "name": "Alice",
    "friends": [
        "Bob",
        "Eva",
        "Jack"
    ]
}

地理座標

geo は地理座標を表すために使用されます。

単一および複数の geo 値の例:

{
    "location": {
        "longitude": 52.5200,
        "latitude": 13.4050
    },
    "cities": [
        {
            "longitude": 51.5072,
            "latitude": 0.1276
        },
        {
            "longitude": 40.7128,
            "latitude": 74.0060
        }
    ]
}

座標は、longitude - 経度を表し、latitude - 緯度を表す2つのフィールドを含むオブジェクトとして記述する必要があります。

ペイロードを使用したポイントの作成

REST API (architecture)

PUT /collections/{collection_name}/points

{
    "points": [
        {
            "id": 1,
            "vector": [0.05, 0.61, 0.76, 0.74],
            "payload": {"city": "Berlin", "price": 1.99}
        },
        {
            "id": 2,
            "vector": [0.19, 0.81, 0.75, 0.11],
            "payload": {"city": ["Berlin", "London"], "price": 1.99}
        },
        {
            "id": 3,
            "vector": [0.36, 0.55, 0.47, 0.94],
            "payload": {"city": ["Berlin", "Moscow"], "price": [1.99, 2.99]}
        }
    ]
}

ペイロードの設定

REST API(スキーマ):

POST /collections/{collection_name}/points/payload

{
    "payload": {
        "property1": "string",
        "property2": "string"
    },
    "points": [
        0, 3, 100
    ]
}

ペイロードの削除

このメソッドは指定された点から特定のペイロードキーを削除します。

REST API(スキーマ):

POST /collections/{collection_name}/points/payload/delete

{
    "keys": ["color", "price"],
    "points": [0, 3, 100]
}

ペイロードのクリア

このメソッドは指定された点からすべてのペイロードキーを削除します。

REST API(スキーマ):

POST /collections/{collection_name}/points/payload/clear

{
    "points": [0, 3, 100]
}

また、IDを指定する代わりに、models.FilterSelector を使用して、特定のフィルタ条件に一致する点を削除することもできます。

ペイロードのインデックス化

Qdrantは、指定したフィールドの名前とタイプを設定することで、ペイロードフィールドに対するインデックスを作成できるため、効率的なフィルタ検索を実行できます。

インデックス化されたフィールドは、ベクトルインデックスにも影響を与えます。

実際の運用では、結果を最も制限する可能性が高いフィールドにインデックスを作成することが推奨されています。例えば、オブジェクトIDに対するインデックス作成は、色に対するインデックス作成よりも効率的です。なぜなら、オブジェクトIDは各レコードごとに一意であり、色はごく少数の可能な値しか持たないからです。

複数のフィールドを含む複合クエリでは、Qdrantは最も制限的なインデックスを最初に使用しようとします。

フィールドのインデックスを作成するためには、以下のようにします:

REST API(スキーマ

PUT /collections/{collection_name}/index

{
    "field_name": "インデックスを作成するフィールドの名前",
    "field_schema": "keyword"
}

インデックス化されたフィールドは、コレクション情報 APIとペイロードスキーマで表示されます。

ペイロードスキーマの例:

{
    "payload_schema": {
        "property1": {
            "data_type": "keyword"
        },
        "property2": {
            "data_type": "integer"
        }
    }
}