DashVector はスキーマフリーとして設計されています。ドキュメントの挿入、ドキュメントの更新、ドキュメントのアップサートのために API を呼び出す際には、フィールドに任意のタイプのキーと値のペアを渡すことができます。次に例を示します。
collection.insert(
Doc(
id='1',
vector=np.random.rand(4),
fields={
'name': 'zhangsan',
'weight':70.0,
'age':30,
'anykey1': 'anyvalue',
'anykey2': 1,
'anykey3': True,
'anykey4': 3.1415926
... ...
}
)
)フィールドが多いほど、メモリやディスクなどのリソースを多く消費します。
サポートされているデータ型
フィールドの場合、DashVector は Python で次の基本データ型をサポートしています。
str
float
int
bool
Python では、int 型は制限のないサイズの整数を表すことができます。ただし、DashVector は -2,147,483,648 ~ 2,147,483,647 の 32 ビット符号付き整数のみをサポートしています。したがって、データがオーバーフローしないようにする必要があります。
フィールドベースの検索
ドキュメントの挿入、ドキュメントの更新、または ドキュメントのアップサートのための API で渡されたキーと値のペアをフィールドで使用して、ドキュメントを検索できます。次に例を示します。
ret = collection.query(
vector=[0.1, 0.2, 0.3, 0.4],
filter='(age > 18 and anykey2 = 1) or (name like "zhang%" and anykey3 = false)'
)検索中、フィールドが多いほど CPU リソースなどのリソースを多く消費し、複雑なフィルター式では結果を取得するための時間オーバーヘッドが大きくなります。
フィールドスキーマを事前に定義するメリット
コレクションの作成時に、フィールドスキーマを事前に定義できます。次に例を示します。
ret = client.create(
name='complex',
dimension=4,
fields_schema={'name': str, 'weight': float, 'age': int}
)フィールドスキーマを事前に定義すると、主に次の 3 つのメリットがあります。
高速な検索: 事前に定義されたフィールドに基づく条件付きフィルタリングにより、時間オーバーヘッドと CPU オーバーヘッドが削減されます。
メモリとディスクの使用量の削減: フィールドが事前に定義されている場合は、値のみを格納する必要があります。そうでない場合は、キーと値の両方を格納する必要があるため、メモリとディスクのリソースを多く消費します。
フィルターの事前検証: フィールドが事前に定義されている場合、条件付きフィルタリング中にフィルターの構文が検証され、予期しないデータ型の入力値が検出されると、DashVector はすぐに失敗を返します。フィールドが事前に定義されていない場合、予期されるデータ型は不明であるため、事前検証を実行できません。
コレクションの作成時に、ほとんどのドキュメントに含まれる決定済みのフィールドを事前に定義し、ドキュメントを挿入する際に、少数のドキュメントに固有の不確定なフィールドを設定することをお勧めします。