DashVector は、スキーマフリーとして設計されています。ドキュメントを挿入、更新、またはアップサートする際に、fields パラメーターに任意のキーと値のペアを渡すことができます。事前のスキーマ定義は不要です。
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
... ...
}
)
)説明
フィールドを追加するごとに、メモリとディスクリソースが消費されます。フィルタリングや取得のニーズに応えるフィールドのみを含めるようにしてください。
サポートされているデータ型
フィールドは、4 つの Python データ型をサポートしています。
| 型 | 説明 | 制約 |
|---|---|---|
str | 文字列値 | -- |
float | 浮動小数点数 | -- |
int | 整数値 | 32 ビット符号付きのみ:-2,147,483,648 ~ 2,147,483,647 |
bool | ブール値 | True または False |
重要
Python の int 型は任意精度をサポートしていますが、DashVector が受け入れるのは 32 ビット符号付き整数 (-2,147,483,648 から 2,147,483,647 まで) のみです。この範囲外の値はオーバーフローエラーを引き起こします。
フィールドによるフィルタリング
フィルター式でフィールドのキーと値のペアを使用して、検索結果を絞り込みます。
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 使用率とクエリのレイテンシーが増加します。
フィールドスキーマを事前定義するケース
DashVector はデフォルトでスキーマフリーですが、コレクションを作成する際にフィールドスキーマを事前定義することで、クエリパフォーマンスの向上、ストレージオーバーヘッドの削減、入力検証の有効化が可能になります。
ret = client.create(
name='complex',
dimension=4,
fields_schema={'name': str, 'weight': float, 'age': int}
)事前定義フィールドのメリット
| メリット | 説明 |
|---|---|
| フィルタリングの高速化 | 条件付きフィルタリングは、アドホックフィールドに対するフィルタリングよりも CPU 使用量が少なく、結果をより速く返します。 |
| ストレージオーバーヘッドの削減 | 事前定義フィールドは値のみを格納します。アドホックフィールドはキーと値の両方を格納するため、より多くのメモリとディスク領域を消費します。 |
| フィルターの事前検証 | DashVector は、フィルター構文を事前定義されたフィールド型に対して検証し、型の不一致がある場合はエラーを返します。スキーマがない場合、型の検証は利用できません。 |
推奨アプローチ
ほとんどのドキュメントに現れ、頻繁にフィルタリングに使用するフィールドは事前定義してください。一部のドキュメントに固有の属性については、挿入時にアドホックフィールドを使用します。