1 前言
向量检索服务DashVector基于阿里云自研的Proxima向量引擎,面对非结构化数据(图片、视频、文本、语音、DNA、分子式等),提供具备垂直和水平扩展的高效相似向量比对服务。使用DashVector服务能有效提升向量检索效率,实现针对非结构化数据的高性能向量检索服务,可广泛应用于大模型搜索、多模态搜索、AI搜索、分子结构分析等几乎所有的 AI 搜索场景。
创建实例(可免费测试):
https://dashvector.console.aliyun.com/cn-hangzhou/cluster
官方文档:
https://help.aliyun.com/document_detail/2510242.html
1.2 环境
测试版本:Python3.10
dashvector==1.0.20
2 新建Client
import dashvector
from dashvector import DashVectorCode
client = dashvector.Client(
api_key='sk-ES***E2C',
endpoint='vrs-cn-***.dashvector.cn-beijing.aliyuncs.com'
)
if client.code == DashVectorCode.Success:
print('create client success!')
3 Collection 操作
3.1 创建Collection
3.1.1 参数说明
参数 |
对应API参数名称 |
说明 |
是否必选 |
Collection名称 |
Name |
命名长度为3-32个字符。 必须由大小写字母、数字和符号(_,-)组成,且必须以字母开头。 Collection名称在Cluster内必须唯一,不允许两个相同名称的Collection同时存在。 付费Cluster最多支持创建32个支持Collection;免费Cluster最多支持创建2个Collection。 |
是 |
向量维度 |
dimension |
向量维度,最小2,最大20000。 向量的维度,指向量数组的大小。例如:[1.0,2.0,3.0] 为3维向量,[1.0,2.0,3.0,4.0] 为4维向量,依次类推。 向量维度大小取决于使用模型输出的向量维度。 |
是 |
向量数据类型 |
dtype |
向量数据类型,指向量数组中元素的数据类型,向量检索服务 DashVector目前支持"Float" (默认)/"INT8" 两种数据类型。例如:[11,22,33,44] 则为INT8型,[1.1,2.2,3.3,4.4] 则为Float型。请根据业务实际情况选择。 |
是 |
距离度量方式 |
metric |
距离度量方式,Cosine /"DotProduct" /"Euclidean" 。为Cosine 时,向量数据类型必须为Float 。 |
是 |
Schema |
fields_schema |
|
否 |
|
|
|
|
3.1.2 Field支持的数据类型
当前DashVector支持Python的4种基础数据类型:
**重要:**Python的int类型可表达无限大小的整数,当前DashVector仅支持32位整数,范围为-2,147,483,648~2,147,483,647,需要用户自行保证数据未溢出。
代码案例
import dashvector
from dashvector import DashVectorCode
from 创建Client import client
fields_schema = {
'title': str,
'user_eval_score': float,
'read_num': int,
'content': str,
'id': dashvector.long
}
ret = client.create(
name='cs_blog',
dimension=512,
metric='dotproduct',
dtype=float,
fields_schema=fields_schema,
timeout=-1
)
if ret.code == DashVectorCode.Success:
print('创建 collection 成功!')
3.2 获取Collection列表
from 创建Client import client
collections = client.list()
print(f"collections: {collections}")
if collections:
for collection in collections:
print(collection)
print("cs_blog是否存在:", 'cs_blog' in collections)
else:
print(collections)
4 Doc操作
4.1 插入带有Fields的Doc
import dashvector
import numpy as np
from dashvector import DashVectorCode, Doc
from 创建Client import client
collection = client.get(name='cs_blog')
data = {
'title': "Prompt 提示词技巧、应用与优化",
'user_eval_score': 5.0,
'read_num': 99,
'content': "Prompt优化是指针对大语言模型(如ChatGPT、通义千问、文心一言等)设计、调整输入提示词(prompt),以提高输出内容的准确性、逻辑性、一致性、可控性等。",
}
ret = collection.insert(
Doc(
id="1",
vector=np.random.rand(512),
fields=data
)
)
print(ret)
print(ret.message)
"""
{
"code": 0,
"message": "Success",
"requests_id": "f868c1f***18d77d33b",
"output": [{
"doc_op": "insert",
"id": "3",
"code": 0,
"message": ""
}]
}
"""

4.2 插入或更新Doc
import dashvector
import numpy as np
from dashvector import DashVectorCode, Doc
from AI.项目测试.vdb.阿里vdb.创建Client import client
collection = client.get(name='cs_blog')
data = {
'title': "Prompt 提示词技巧、应用与优化",
'user_eval_score': 5.0,
'read_num': 99,
'content': "Prompt优化是指针对大语言模型(如ChatGPT、通义千问、文心一言等)设计、调整输入提示词(prompt),以提高输出内容的准确性、逻辑性、一致性、可控性等。",
'anykey2': 1,
'anykey3': True,
'anykey4': 3.1415926
}
ret = collection.upsert(
Doc(
id="1",
vector=np.random.rand(512),
fields=data
)
)
print(ret)
print(ret.message)
"""
{
"code": 0,
"message": "Success",
"requests_id": "f868c1f0-76e1-4c35-8a08-aa118d77d33b",
"output": [{
"doc_op": "insert",
"id": "3",
"code": 0,
"message": ""
}]
}
"""
4.3 根据向量进行相似性检索
4.3.1 常规检索
import dashvector
import numpy as np
from 创建Client import client
collection = client.get(name='cs_blog')
text_vector = np.random.rand(512)
ret = collection.query(
vector=text_vector,
topk=100,
output_fields=['title', 'content'],
include_vector=True
)
output = ret.output
for i in output:
print("-" * 30)
data_id = i.id
fields = i.fields
score = i.score
print(data_id, fields, score)
4.3.2 条件过滤
插入Doc、更新Doc、插入或更新Doc 时所设置的任意KeyValue结构的字段(Field),可在检索Doc进行条件过滤,如下所示:
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)'
)
4.4 删除Doc
from AI.项目测试.vdb.阿里vdb.创建Client import client
collection = client.get(name='cs_blog')
ret = collection.delete('1')
if ret:
print('delete success')
ret = collection.delete(['1', '2'])
ret = collection.delete(delete_all=True)
5 Partition操作
5.1 新建 Partition
创建一个名称为 program 的Partition
from 创建Client import client
collection = client.get(name='cs_blog')
ret1 = collection.create_partition('program')
ret2 = collection.create_partition('news')
if ret1:
print('创建partition success')
5.2 获取Partition 列表
from AI.项目测试.vdb.阿里vdb.创建Client import client
collection = client.get(name='cs_blog')
partitions = collection.list_partitions()
if partitions:
for pt in partitions:
print(f"pt: {pt}")
else:
print(partitions)

5.3 统计Partition
from 创建Client import client
collection = client.get(name='cs_blog')
ret = collection.stats_partition('program')
print(ret)
5.4 删除 Partition
删除Partition后,该Partition所有数据将删除且不可恢复,请谨慎操作。
from 创建Client import client
collection = client.get(name='cs_blog')
ret = collection.delete_partition('news')
if ret:
print('删除partition 成功')
6 状态码说明
向量检索服务DashVector的返回状态码。
Reason |
Code |
Description |
Success |
0 |
成功 |
Timeout |
408 |
超时 |
Closed |
-998 |
客户端已关闭 |
Unknown |
-999 |
未知异常 |
EmptyCollectionName |
-2000 |
集合名称为空 |
EmptyColumnName |
-2001 |
字段名称为空 |
EmptyPartitionName |
-2002 |
分区名称为空 |
EmptyColumns |
-2003 |
文档中字段为空 |
EmptyPrimaryKey |
-2004 |
插入的文档主键为空 |
EmptyDocList |
-2005 |
插入的文档列表为空 |
EmptyDocFields |
-2006 |
文档的字段列表为空 |
EmptyIndexField |
-2007 |
文档的索引字段为空 |
InvalidRecord |
-2008 |
无效的文档记录 |
InvalidQuery |
-2009 |
无效的查询请求 |
InvalidWriteRequest |
-2010 |
无效的写请求 |
InvalidVectorFormat |
-2011 |
无效的向量格式 |
InvalidDataType |
-2012 |
无效的向量数据类型 |
InvalidIndexType |
-2013 |
无效的索引类型 |
InvalidFeature |
-2014 |
无效的向量 |
InvalidFilter |
-2015 |
无效的过滤条件 |
InvalidPrimaryKey |
-2016 |
无效的主键 |
InvalidField |
-2017 |
无效的文档字段 |
MismatchedIndexColumn |
-2018 |
索引字段不匹配 |
MismatchedDimension |
-2019 |
向量维度不匹配 |
MismatchedDataType |
-2020 |
向量数据类型不匹配 |
InexistentCollection |
-2021 |
集合不存在 |
InexistentPartition |
-2022 |
分区不存在 |
InexistentColumn |
-2023 |
字段不存在 |
InexistentKey |
-2024 |
主键不存在 |
DuplicateCollection |
-2025 |
集合已存在 |
DuplicatePartition |
-2026 |
分区已存在 |
DuplicateKey |
-2027 |
文档主键重复 |
DuplicateField |
-2028 |
文档字段重复 |
UnreadyPartition |
-2029 |
分区状态未就绪 |
UnreadyCollection |
-2030 |
集合状态未就绪 |
UnsupportedCondition |
-2031 |
不支持的查询条件 |
MismatchedBatchResult |
-2031 |
批量查询语句不匹配 |
OrderbyNotInSelectItems |
-2032 |
无效的排序字段 |
PbToSqlInfoError |
-2033 |
查询参数转化失败 |
ExceedRateLimit |
-2034 |
触发流控 |
InvalidSparseValues |
-2035 |
无效的稀疏向量值 |
InvalidBatchSize |
-2036 |
无效的批次数量 |
InvalidDimension |
-2037 |
无效的维度 |
InvalidExtraParam |
-2038 |
无效的额外参数 |
InvalidRadius |
-2039 |
错误的半径查询参数 |
InvalidLinear |
-2040 |
错误的线性查询参数 |
InvalidTopk |
-2041 |
无效的TopK |
InvalidCollectionName |
-2042 |
无效的集合名 |
InvalidPartitionName |
-2043 |
无效的分区名 |
InvalidFieldName |
-2044 |
无效的文档字段名 |
InvalidChannelCount |
-2045 |
无效的分片数量 |
InvalidReplicaCount |
-2046 |
无效的副本数量 |
InvalidJson |
-2047 |
无效的JSON |
InvalidClusterConfig |
-2048 |
Cluster参数错误 |
DuplicateCluster |
-2049 |
重复的Cluster |
InexistentCluster |
-2050 |
不存在的Cluster |
InvalidClusterStatus |
-2051 |
无效的Cluster状态 |
RpcTimedout |
-2052 |
RPC请求超时 |
InvalidGroupBy |
-2053 |
无效的分组查询请求 |
AllOpFailed |
-2938 |
批操作全部失败 |
ClusterWhitelistError |
-2939 |
Cluster白名单验证失败 |
InvalidQuantizeType |
-2947 |
无效的量化类型 |
CollectionDumperNotExist |
-2948 |
集合dump任务不存在 |
CollectionDumperExist |
-2949 |
集合最近一次dump未结束 |
CollectionDumperError |
-2950 |
集合dump失败 |
InvalidSparseIndices |
-2951 |
无效的稀疏向量索引 |
InvalidEndpoint |
-2952 |
无效的Endpoint |
NoAuthCluster |
-2958 |
无权限访问的Cluster |
SignatureErr |
-2959 |
签名错误 |
ClusterNotServicing |
-2961 |
Cluster状态未就绪 |
InvalidClusterName |
-2962 |
无效的Cluster名称 |
InvalidClusterStatus |
-2963 |
无效的Cluster状态 |
ForbidCreateCollection |
-2964 |
Cluster更新时不允许创建集合 |
CeasedCluster |
-2965 |
Cluster已欠费 |
InvalidClusterSpecifiation |
-2966 |
无效的Cluster规格 |
ExceedIdsLimit |
-2967 |
文档主键超限 |
InvalidVectorType |
-2968 |
无效向量类型 |
ExceedRequestSize |
-2970 |
请求大小超限 |
EmptyClusterName |
-2971 |
Cluster名称为空 |
EmptyVectorAndId |
-2972 |
向量和主键同时为空 |
ExistVectorAndId |
-2973 |
向量和主键都存在 |
TokenEmpty |
-2976 |
ApiKey为空 |
TokenDelete |
-2978 |
ApiKey已删除 |
TokenExpired |
-2979 |
ApiKey过期 |
TokenDontExist |
-2980 |
ApiKey不存在 |
DropPartitonFilter |
-2992 |
禁止删除默认分区 |
InvalidDocId |
-2994 |
无效文档主键 |
ExceedFieldLimit |
-2995 |
文档字段超限 |
ExceedCollectionLimit |
-2996 |
创建集合超限 |
ExceedPartitionLimit |
-2997 |
创建分区超限 |
ExceedDocLimit |
-2998 |
插入文本超限 |
InvalidArgument |
-2999 |
无效参数 |
SystemError |
-50000 |
系统错误 |
<h2><a id="1__0"></a>1 前言</h2>
<p>向量检索服务DashVector基于阿里云自研的Proxima向量引擎,面对非结构化数据(图片、视频、文本、语音、DNA、分子式等),提供具备垂直和水平扩展的高效相似向量比对服务。使用DashVector服务能有效提升向量检索效率,实现针对非结构化数据的高性能向量检索服务,可广泛应用于大模型搜索、多模态搜索、AI搜索、分子结构分析等几乎所有的 AI 搜索场景。</p>
<p>创建实例(可免费测试):</p>
<p><a href="https://dashvector.console.aliyun.com/cn-hangzhou/cluster" target="_blank">https://dashvector.console.aliyun.com/cn-hangzhou/cluster</a></p>
<p>官方文档:</p>
<p><a href="https://help.aliyun.com/document_detail/2510242.html" target="_blank">https://help.aliyun.com/document_detail/2510242.html</a></p>
<h3><a id="12__12"></a>1.2 环境</h3>
<p>测试版本:Python3.10</p>
<pre><div class="hljs"><code class="lang-shell">dashvector==1.0.20
</code></div></pre>
<h2><a id="2_Client_20"></a>2 新建Client</h2>
<pre><div class="hljs"><code class="lang-python"><span class="hljs-comment"># -*- coding: utf-8 -*-</span>
<span class="hljs-keyword">import</span> dashvector
<span class="hljs-keyword">from</span> dashvector <span class="hljs-keyword">import</span> DashVectorCode
client = dashvector.Client(
api_key=<span class="hljs-string">'sk-ES***E2C'</span>, <span class="hljs-comment"># YOUR_API_KEY</span>
endpoint=<span class="hljs-string">'vrs-cn-***.dashvector.cn-beijing.aliyuncs.com'</span> <span class="hljs-comment"># YOUR_CLUSTER_ENDPOINT</span>
)
<span class="hljs-comment"># 判断client是否创建成功</span>
<span class="hljs-keyword">if</span> client.code == DashVectorCode.Success:
<span class="hljs-built_in">print</span>(<span class="hljs-string">'create client success!'</span>)
</code></div></pre>
<h2><a id="3_Collection__37"></a>3 Collection 操作</h2>
<h3><a id="31_Collection_39"></a>3.1 创建Collection</h3>
<h4><a id="311__41"></a>3.1.1 参数说明</h4>
<table>
<thead>
<tr>
<th><strong>参数</strong></th>
<th><strong>对应API参数名称</strong></th>
<th><strong>说明</strong></th>
<th><strong>是否必选</strong></th>
</tr>
</thead>
<tbody>
<tr>
<td>Collection名称</td>
<td>Name</td>
<td>命名长度为3-32个字符。 必须由大小写字母、数字和符号(_,-)组成,且必须以字母开头。 Collection名称在Cluster内必须唯一,不允许两个相同名称的Collection同时存在。 付费Cluster最多支持创建32个支持Collection;免费Cluster最多支持创建2个Collection。</td>
<td>是</td>
</tr>
<tr>
<td>向量维度</td>
<td>dimension</td>
<td>向量维度,最小2,最大20000。<br />向量的维度,指向量数组的大小。例如:[1.0,2.0,3.0] 为3维向量,[1.0,2.0,3.0,4.0] 为4维向量,依次类推。 向量维度大小取决于使用模型输出的向量维度。</td>
<td>是</td>
</tr>
<tr>
<td>向量数据类型</td>
<td>dtype</td>
<td>向量数据类型,指向量数组中元素的数据类型,向量检索服务 DashVector目前支持<code>"Float"</code>(默认)/<code>"INT8"</code>两种数据类型。例如:[11,22,33,44] 则为INT8型,[1.1,2.2,3.3,4.4] 则为Float型。请根据业务实际情况选择。</td>
<td>是</td>
</tr>
<tr>
<td>距离度量方式</td>
<td>metric</td>
<td>距离度量方式,<code>Cosine</code>/<code>"DotProduct"</code>/<code>"Euclidean"</code>。为<code>Cosine</code>时,向量数据类型必须为<code>Float</code>。</td>
<td>是</td>
</tr>
<tr>
<td>Schema</td>
<td>fields_schema</td>
<td></td>
<td>否</td>
</tr>
<tr>
<td></td>
<td></td>
<td></td>
<td></td>
</tr>
</tbody>
</table>
<h4><a id="312_Field_52"></a>3.1.2 Field支持的数据类型</h4>
<p>当前DashVector支持Python的4种基础数据类型:</p>
<ul>
<li>str</li>
<li>float</li>
<li>int</li>
<li>bool</li>
</ul>
<blockquote>
<p>**重要:**Python的int类型可表达无限大小的整数,当前DashVector仅支持32位整数,范围为-2,147,483,648~2,147,483,647,需要用户自行保证数据未溢出。</p>
</blockquote>
<p>代码案例</p>
<pre><div class="hljs"><code class="lang-python"><span class="hljs-comment"># -*- coding: utf-8 -*-</span>
<span class="hljs-keyword">import</span> dashvector
<span class="hljs-keyword">from</span> dashvector <span class="hljs-keyword">import</span> DashVectorCode
<span class="hljs-keyword">from</span> 创建Client <span class="hljs-keyword">import</span> client
<span class="hljs-comment"># 定义字段</span>
fields_schema = {
<span class="hljs-string">'title'</span>: <span class="hljs-built_in">str</span>,
<span class="hljs-string">'user_eval_score'</span>: <span class="hljs-built_in">float</span>,
<span class="hljs-string">'read_num'</span>: <span class="hljs-built_in">int</span>,
<span class="hljs-string">'content'</span>: <span class="hljs-built_in">str</span>,
<span class="hljs-string">'id'</span>: dashvector.long
}
ret = client.create(
name=<span class="hljs-string">'cs_blog'</span>,
dimension=<span class="hljs-number">512</span>, <span class="hljs-comment"># 向量维度为512</span>
metric=<span class="hljs-string">'dotproduct'</span>, <span class="hljs-comment"># 距离度量方式为dotproduct(内积)的Collection</span>
dtype=<span class="hljs-built_in">float</span>, <span class="hljs-comment"># 向量数据类型为str(默认)float</span>
fields_schema=fields_schema, <span class="hljs-comment"># 为保留类型注解的语义明确性,DashVector通过typing模块定义long类型,为需要显式标注大整数场景提供了类型标注支持</span>
timeout=-<span class="hljs-number">1</span> <span class="hljs-comment"># timeout为-1 ,开启create接口异步模式</span>
)
<span class="hljs-comment"># 判断collection是否创建成功</span>
<span class="hljs-keyword">if</span> ret.code == DashVectorCode.Success:
<span class="hljs-built_in">print</span>(<span class="hljs-string">'创建 collection 成功!'</span>)
</code></div></pre>
<h3><a id="32_Collection_97"></a>3.2 获取Collection列表</h3>
<pre><div class="hljs"><code class="lang-python"><span class="hljs-comment"># -*- coding: utf-8 -*-</span>
<span class="hljs-keyword">from</span> 创建Client <span class="hljs-keyword">import</span> client
collections = client.<span class="hljs-built_in">list</span>()
<span class="hljs-built_in">print</span>(<span class="hljs-string">f"collections: <span class="hljs-subst">{collections}</span>"</span>)
<span class="hljs-comment"># 判断list接口是否成功</span>
<span class="hljs-keyword">if</span> collections:
<span class="hljs-comment"># 查看所有collections</span>
<span class="hljs-keyword">for</span> collection <span class="hljs-keyword">in</span> collections:
<span class="hljs-built_in">print</span>(collection)
<span class="hljs-comment"># 判断某个collection是否存在</span>
<span class="hljs-built_in">print</span>(<span class="hljs-string">"cs_blog是否存在:"</span>, <span class="hljs-string">'cs_blog'</span> <span class="hljs-keyword">in</span> collections)
<span class="hljs-keyword">else</span>:
<span class="hljs-comment"># 若获取失败,打印错误信息</span>
<span class="hljs-built_in">print</span>(collections)
</code></div></pre>
<h2><a id="4_Doc_121"></a>4 Doc操作</h2>
<h3><a id="41_FieldsDoc_123"></a>4.1 插入带有Fields的Doc</h3>
<pre><div class="hljs"><code class="lang-python"><span class="hljs-comment"># -*- coding: utf-8 -*-</span>
<span class="hljs-keyword">import</span> dashvector
<span class="hljs-keyword">import</span> numpy <span class="hljs-keyword">as</span> np
<span class="hljs-keyword">from</span> dashvector <span class="hljs-keyword">import</span> DashVectorCode, Doc
<span class="hljs-keyword">from</span> 创建Client <span class="hljs-keyword">import</span> client
collection = client.get(name=<span class="hljs-string">'cs_blog'</span>)
data = {
<span class="hljs-comment"># 设置Schema-Free的Field & Value</span>
<span class="hljs-string">'title'</span>: <span class="hljs-string">"Prompt 提示词技巧、应用与优化"</span>,
<span class="hljs-string">'user_eval_score'</span>: <span class="hljs-number">5.0</span>,
<span class="hljs-string">'read_num'</span>: <span class="hljs-number">99</span>,
<span class="hljs-string">'content'</span>: <span class="hljs-string">"Prompt优化是指针对大语言模型(如ChatGPT、通义千问、文心一言等)设计、调整输入提示词(prompt),以提高输出内容的准确性、逻辑性、一致性、可控性等。"</span>,
<span class="hljs-comment"># 'id': dashvector.long,</span>
<span class="hljs-comment"># 设置Schema-Free的Field & Value</span>
<span class="hljs-comment"># 'anykey2': 1,</span>
<span class="hljs-comment"># 'anykey3': True,</span>
<span class="hljs-comment"># 'anykey4': 3.1415926</span>
}
<span class="hljs-comment"># insert单条数据,并设置Fields Value</span>
ret = collection.insert(
Doc(
<span class="hljs-built_in">id</span>=<span class="hljs-string">"1"</span>,
vector=np.random.rand(<span class="hljs-number">512</span>),
fields=data
)
)
<span class="hljs-built_in">print</span>(ret)
<span class="hljs-built_in">print</span>(ret.message)
<span class="hljs-string">"""
{
"code": 0,
"message": "Success",
"requests_id": "f868c1f***18d77d33b",
"output": [{
"doc_op": "insert",
"id": "3",
"code": 0,
"message": ""
}]
}
"""</span>
</code></div></pre>
<p><img src="https://static.couragesteak.com/article/39f05e2993e391584f069ad021924b91.png" alt="阿里DashVector向量库插入带有Fields的Doc" /></p>
<h3><a id="42_Doc_179"></a>4.2 插入或更新Doc</h3>
<pre><div class="hljs"><code class="lang-python"><span class="hljs-comment"># -*- coding: utf-8 -*-</span>
<span class="hljs-keyword">import</span> dashvector
<span class="hljs-keyword">import</span> numpy <span class="hljs-keyword">as</span> np
<span class="hljs-keyword">from</span> dashvector <span class="hljs-keyword">import</span> DashVectorCode, Doc
<span class="hljs-keyword">from</span> AI.项目测试.vdb.阿里vdb.创建Client <span class="hljs-keyword">import</span> client
collection = client.get(name=<span class="hljs-string">'cs_blog'</span>)
data = {
<span class="hljs-comment"># 设置Schema-Free的Field & Value</span>
<span class="hljs-string">'title'</span>: <span class="hljs-string">"Prompt 提示词技巧、应用与优化"</span>,
<span class="hljs-string">'user_eval_score'</span>: <span class="hljs-number">5.0</span>,
<span class="hljs-string">'read_num'</span>: <span class="hljs-number">99</span>,
<span class="hljs-string">'content'</span>: <span class="hljs-string">"Prompt优化是指针对大语言模型(如ChatGPT、通义千问、文心一言等)设计、调整输入提示词(prompt),以提高输出内容的准确性、逻辑性、一致性、可控性等。"</span>,
<span class="hljs-comment"># 'id': dashvector.long,</span>
<span class="hljs-comment"># 设置Schema-Free的Field & Value</span>
<span class="hljs-string">'anykey2'</span>: <span class="hljs-number">1</span>,
<span class="hljs-string">'anykey3'</span>: <span class="hljs-literal">True</span>,
<span class="hljs-string">'anykey4'</span>: <span class="hljs-number">3.1415926</span>
}
<span class="hljs-comment"># insert单条数据,并设置Fields Value</span>
ret = collection.upsert(
Doc(
<span class="hljs-built_in">id</span>=<span class="hljs-string">"1"</span>,
vector=np.random.rand(<span class="hljs-number">512</span>),
fields=data
)
)
<span class="hljs-built_in">print</span>(ret)
<span class="hljs-built_in">print</span>(ret.message)
<span class="hljs-string">"""
{
"code": 0,
"message": "Success",
"requests_id": "f868c1f0-76e1-4c35-8a08-aa118d77d33b",
"output": [{
"doc_op": "insert",
"id": "3",
"code": 0,
"message": ""
}]
}
"""</span>
</code></div></pre>
<h3><a id="43__232"></a>4.3 根据向量进行相似性检索</h3>
<h4><a id="431__234"></a>4.3.1 常规检索</h4>
<pre><div class="hljs"><code class="lang-python"><span class="hljs-comment"># -*- coding: utf-8 -*-</span>
<span class="hljs-keyword">import</span> dashvector
<span class="hljs-keyword">import</span> numpy <span class="hljs-keyword">as</span> np
<span class="hljs-keyword">from</span> 创建Client <span class="hljs-keyword">import</span> client
collection = client.get(name=<span class="hljs-string">'cs_blog'</span>)
<span class="hljs-comment"># 文本向量化:这里随机生成一个512维的向量</span>
text_vector = np.random.rand(<span class="hljs-number">512</span>)
ret = collection.query(
vector=text_vector,
topk=<span class="hljs-number">100</span>,
output_fields=[<span class="hljs-string">'title'</span>, <span class="hljs-string">'content'</span>], <span class="hljs-comment"># 仅返回name、age这2个Field</span>
include_vector=<span class="hljs-literal">True</span>
)
output = ret.output
<span class="hljs-keyword">for</span> i <span class="hljs-keyword">in</span> output:
<span class="hljs-built_in">print</span>(<span class="hljs-string">"-"</span> * <span class="hljs-number">30</span>)
data_id = i.<span class="hljs-built_in">id</span>
fields = i.fields
score = i.score
<span class="hljs-built_in">print</span>(data_id, fields, score)
</code></div></pre>
<h4><a id="432__264"></a>4.3.2 条件过滤</h4>
<p><strong>插入Doc</strong>、<strong>更新Doc</strong>、<strong>插入或更新Doc</strong> 时所设置的任意KeyValue结构的字段(Field),可在<a href="https://help.aliyun.com/document_detail/2510250.html" target="_blank">检索Doc</a>进行条件过滤,如下所示:</p>
<pre><div class="hljs"><code class="lang-python">ret = collection.query(
vector=[<span class="hljs-number">0.1</span>, <span class="hljs-number">0.2</span>, <span class="hljs-number">0.3</span>, <span class="hljs-number">0.4</span>],
<span class="hljs-built_in">filter</span>=<span class="hljs-string">'(age > 18 and anykey2 = 1) or (name like "zhang%" and anykey3 = false)'</span>
)
</code></div></pre>
<h3><a id="44_Doc_275"></a>4.4 删除Doc</h3>
<pre><div class="hljs"><code class="lang-python"><span class="hljs-keyword">from</span> AI.项目测试.vdb.阿里vdb.创建Client <span class="hljs-keyword">import</span> client
collection = client.get(name=<span class="hljs-string">'cs_blog'</span>)
ret = collection.delete(<span class="hljs-string">'1'</span>)
<span class="hljs-comment"># 判断delete接口是否成功</span>
<span class="hljs-keyword">if</span> ret:
<span class="hljs-built_in">print</span>(<span class="hljs-string">'delete success'</span>)
<span class="hljs-comment"># 批量delete</span>
ret = collection.delete([<span class="hljs-string">'1'</span>, <span class="hljs-string">'2'</span>])
<span class="hljs-comment"># 清理所有partition数据</span>
ret = collection.delete(delete_all=<span class="hljs-literal">True</span>)
</code></div></pre>
<h2><a id="5_Partition_294"></a>5 Partition操作</h2>
<h3><a id="51__Partition_296"></a>5.1 新建 Partition</h3>
<p>创建一个名称为 program 的Partition</p>
<pre><div class="hljs"><code class="lang-python"><span class="hljs-keyword">from</span> 创建Client <span class="hljs-keyword">import</span> client
collection = client.get(name=<span class="hljs-string">'cs_blog'</span>)
<span class="hljs-comment"># 创建一个名称为 program 的Partition</span>
ret1 = collection.create_partition(<span class="hljs-string">'program'</span>)
<span class="hljs-comment"># 新闻</span>
ret2 = collection.create_partition(<span class="hljs-string">'news'</span>)
<span class="hljs-comment"># 判断create_partition接口是否成功</span>
<span class="hljs-keyword">if</span> ret1:
<span class="hljs-built_in">print</span>(<span class="hljs-string">'创建partition success'</span>)
</code></div></pre>
<h3><a id="52_Partition__315"></a>5.2 获取Partition 列表</h3>
<pre><div class="hljs"><code class="lang-python"><span class="hljs-keyword">from</span> AI.项目测试.vdb.阿里vdb.创建Client <span class="hljs-keyword">import</span> client
collection = client.get(name=<span class="hljs-string">'cs_blog'</span>)
partitions = collection.list_partitions()
<span class="hljs-comment"># 判断list_partitions接口是否成功</span>
<span class="hljs-keyword">if</span> partitions:
<span class="hljs-comment"># 查看所有partitions</span>
<span class="hljs-keyword">for</span> pt <span class="hljs-keyword">in</span> partitions:
<span class="hljs-built_in">print</span>(<span class="hljs-string">f"pt: <span class="hljs-subst">{pt}</span>"</span>)
<span class="hljs-keyword">else</span>:
<span class="hljs-comment"># 若获取失败,打印错误信息</span>
<span class="hljs-built_in">print</span>(partitions)
</code></div></pre>
<p><img src="https://static.couragesteak.com/article/835d16b6eb44b28821714603fdc14c75.png" alt="阿里DashVector获取Partition列表" /></p>
<h3><a id="53_Partition_337"></a>5.3 统计Partition</h3>
<pre><div class="hljs"><code class="lang-python"><span class="hljs-keyword">from</span> 创建Client <span class="hljs-keyword">import</span> client
collection = client.get(name=<span class="hljs-string">'cs_blog'</span>)
ret = collection.stats_partition(<span class="hljs-string">'program'</span>)
<span class="hljs-built_in">print</span>(ret)
<span class="hljs-comment"># {</span>
<span class="hljs-comment"># "code": 0,</span>
<span class="hljs-comment"># "message": "",</span>
<span class="hljs-comment"># "requests_id": "607f51***59180",</span>
<span class="hljs-comment"># "output": {</span>
<span class="hljs-comment"># "total_doc_count": 0</span>
<span class="hljs-comment"># }</span>
<span class="hljs-comment"># }</span>
</code></div></pre>
<h3><a id="54__Partition_357"></a>5.4 删除 Partition</h3>
<p>删除Partition后,该Partition所有数据将删除且不可恢复,请谨慎操作。</p>
<pre><div class="hljs"><code class="lang-python"><span class="hljs-keyword">from</span> 创建Client <span class="hljs-keyword">import</span> client
collection = client.get(name=<span class="hljs-string">'cs_blog'</span>)
<span class="hljs-comment"># 删除名称为shoes的Partition</span>
ret = collection.delete_partition(<span class="hljs-string">'news'</span>)
<span class="hljs-comment"># 判断delete_partition接口是否成功</span>
<span class="hljs-keyword">if</span> ret:
<span class="hljs-built_in">print</span>(<span class="hljs-string">'删除partition 成功'</span>)
</code></div></pre>
<h2><a id="6__374"></a>6 状态码说明</h2>
<p>向量检索服务DashVector的返回状态码。</p>
<table>
<thead>
<tr>
<th><strong>Reason</strong></th>
<th><strong>Code</strong></th>
<th><strong>Description</strong></th>
</tr>
</thead>
<tbody>
<tr>
<td>Success</td>
<td>0</td>
<td>成功</td>
</tr>
<tr>
<td>Timeout</td>
<td>408</td>
<td>超时</td>
</tr>
<tr>
<td>Closed</td>
<td>-998</td>
<td>客户端已关闭</td>
</tr>
<tr>
<td>Unknown</td>
<td>-999</td>
<td>未知异常</td>
</tr>
<tr>
<td>EmptyCollectionName</td>
<td>-2000</td>
<td>集合名称为空</td>
</tr>
<tr>
<td>EmptyColumnName</td>
<td>-2001</td>
<td>字段名称为空</td>
</tr>
<tr>
<td>EmptyPartitionName</td>
<td>-2002</td>
<td>分区名称为空</td>
</tr>
<tr>
<td>EmptyColumns</td>
<td>-2003</td>
<td>文档中字段为空</td>
</tr>
<tr>
<td>EmptyPrimaryKey</td>
<td>-2004</td>
<td>插入的文档主键为空</td>
</tr>
<tr>
<td>EmptyDocList</td>
<td>-2005</td>
<td>插入的文档列表为空</td>
</tr>
<tr>
<td>EmptyDocFields</td>
<td>-2006</td>
<td>文档的字段列表为空</td>
</tr>
<tr>
<td>EmptyIndexField</td>
<td>-2007</td>
<td>文档的索引字段为空</td>
</tr>
<tr>
<td>InvalidRecord</td>
<td>-2008</td>
<td>无效的文档记录</td>
</tr>
<tr>
<td>InvalidQuery</td>
<td>-2009</td>
<td>无效的查询请求</td>
</tr>
<tr>
<td>InvalidWriteRequest</td>
<td>-2010</td>
<td>无效的写请求</td>
</tr>
<tr>
<td>InvalidVectorFormat</td>
<td>-2011</td>
<td>无效的向量格式</td>
</tr>
<tr>
<td>InvalidDataType</td>
<td>-2012</td>
<td>无效的向量数据类型</td>
</tr>
<tr>
<td>InvalidIndexType</td>
<td>-2013</td>
<td>无效的索引类型</td>
</tr>
<tr>
<td>InvalidFeature</td>
<td>-2014</td>
<td>无效的向量</td>
</tr>
<tr>
<td>InvalidFilter</td>
<td>-2015</td>
<td>无效的过滤条件</td>
</tr>
<tr>
<td>InvalidPrimaryKey</td>
<td>-2016</td>
<td>无效的主键</td>
</tr>
<tr>
<td>InvalidField</td>
<td>-2017</td>
<td>无效的文档字段</td>
</tr>
<tr>
<td>MismatchedIndexColumn</td>
<td>-2018</td>
<td>索引字段不匹配</td>
</tr>
<tr>
<td>MismatchedDimension</td>
<td>-2019</td>
<td>向量维度不匹配</td>
</tr>
<tr>
<td>MismatchedDataType</td>
<td>-2020</td>
<td>向量数据类型不匹配</td>
</tr>
<tr>
<td>InexistentCollection</td>
<td>-2021</td>
<td>集合不存在</td>
</tr>
<tr>
<td>InexistentPartition</td>
<td>-2022</td>
<td>分区不存在</td>
</tr>
<tr>
<td>InexistentColumn</td>
<td>-2023</td>
<td>字段不存在</td>
</tr>
<tr>
<td>InexistentKey</td>
<td>-2024</td>
<td>主键不存在</td>
</tr>
<tr>
<td>DuplicateCollection</td>
<td>-2025</td>
<td>集合已存在</td>
</tr>
<tr>
<td>DuplicatePartition</td>
<td>-2026</td>
<td>分区已存在</td>
</tr>
<tr>
<td>DuplicateKey</td>
<td>-2027</td>
<td>文档主键重复</td>
</tr>
<tr>
<td>DuplicateField</td>
<td>-2028</td>
<td>文档字段重复</td>
</tr>
<tr>
<td>UnreadyPartition</td>
<td>-2029</td>
<td>分区状态未就绪</td>
</tr>
<tr>
<td>UnreadyCollection</td>
<td>-2030</td>
<td>集合状态未就绪</td>
</tr>
<tr>
<td>UnsupportedCondition</td>
<td>-2031</td>
<td>不支持的查询条件</td>
</tr>
<tr>
<td>MismatchedBatchResult</td>
<td>-2031</td>
<td>批量查询语句不匹配</td>
</tr>
<tr>
<td>OrderbyNotInSelectItems</td>
<td>-2032</td>
<td>无效的排序字段</td>
</tr>
<tr>
<td>PbToSqlInfoError</td>
<td>-2033</td>
<td>查询参数转化失败</td>
</tr>
<tr>
<td>ExceedRateLimit</td>
<td>-2034</td>
<td>触发流控</td>
</tr>
<tr>
<td>InvalidSparseValues</td>
<td>-2035</td>
<td>无效的稀疏向量值</td>
</tr>
<tr>
<td>InvalidBatchSize</td>
<td>-2036</td>
<td>无效的批次数量</td>
</tr>
<tr>
<td>InvalidDimension</td>
<td>-2037</td>
<td>无效的维度</td>
</tr>
<tr>
<td>InvalidExtraParam</td>
<td>-2038</td>
<td>无效的额外参数</td>
</tr>
<tr>
<td>InvalidRadius</td>
<td>-2039</td>
<td>错误的半径查询参数</td>
</tr>
<tr>
<td>InvalidLinear</td>
<td>-2040</td>
<td>错误的线性查询参数</td>
</tr>
<tr>
<td>InvalidTopk</td>
<td>-2041</td>
<td>无效的TopK</td>
</tr>
<tr>
<td>InvalidCollectionName</td>
<td>-2042</td>
<td>无效的集合名</td>
</tr>
<tr>
<td>InvalidPartitionName</td>
<td>-2043</td>
<td>无效的分区名</td>
</tr>
<tr>
<td>InvalidFieldName</td>
<td>-2044</td>
<td>无效的文档字段名</td>
</tr>
<tr>
<td>InvalidChannelCount</td>
<td>-2045</td>
<td>无效的分片数量</td>
</tr>
<tr>
<td>InvalidReplicaCount</td>
<td>-2046</td>
<td>无效的副本数量</td>
</tr>
<tr>
<td>InvalidJson</td>
<td>-2047</td>
<td>无效的JSON</td>
</tr>
<tr>
<td>InvalidClusterConfig</td>
<td>-2048</td>
<td>Cluster参数错误</td>
</tr>
<tr>
<td>DuplicateCluster</td>
<td>-2049</td>
<td>重复的Cluster</td>
</tr>
<tr>
<td>InexistentCluster</td>
<td>-2050</td>
<td>不存在的Cluster</td>
</tr>
<tr>
<td>InvalidClusterStatus</td>
<td>-2051</td>
<td>无效的Cluster状态</td>
</tr>
<tr>
<td>RpcTimedout</td>
<td>-2052</td>
<td>RPC请求超时</td>
</tr>
<tr>
<td>InvalidGroupBy</td>
<td>-2053</td>
<td>无效的分组查询请求</td>
</tr>
<tr>
<td>AllOpFailed</td>
<td>-2938</td>
<td>批操作全部失败</td>
</tr>
<tr>
<td>ClusterWhitelistError</td>
<td>-2939</td>
<td>Cluster白名单验证失败</td>
</tr>
<tr>
<td>InvalidQuantizeType</td>
<td>-2947</td>
<td>无效的量化类型</td>
</tr>
<tr>
<td>CollectionDumperNotExist</td>
<td>-2948</td>
<td>集合dump任务不存在</td>
</tr>
<tr>
<td>CollectionDumperExist</td>
<td>-2949</td>
<td>集合最近一次dump未结束</td>
</tr>
<tr>
<td>CollectionDumperError</td>
<td>-2950</td>
<td>集合dump失败</td>
</tr>
<tr>
<td>InvalidSparseIndices</td>
<td>-2951</td>
<td>无效的稀疏向量索引</td>
</tr>
<tr>
<td>InvalidEndpoint</td>
<td>-2952</td>
<td>无效的Endpoint</td>
</tr>
<tr>
<td>NoAuthCluster</td>
<td>-2958</td>
<td>无权限访问的Cluster</td>
</tr>
<tr>
<td>SignatureErr</td>
<td>-2959</td>
<td>签名错误</td>
</tr>
<tr>
<td>ClusterNotServicing</td>
<td>-2961</td>
<td>Cluster状态未就绪</td>
</tr>
<tr>
<td>InvalidClusterName</td>
<td>-2962</td>
<td>无效的Cluster名称</td>
</tr>
<tr>
<td>InvalidClusterStatus</td>
<td>-2963</td>
<td>无效的Cluster状态</td>
</tr>
<tr>
<td>ForbidCreateCollection</td>
<td>-2964</td>
<td>Cluster更新时不允许创建集合</td>
</tr>
<tr>
<td>CeasedCluster</td>
<td>-2965</td>
<td>Cluster已欠费</td>
</tr>
<tr>
<td>InvalidClusterSpecifiation</td>
<td>-2966</td>
<td>无效的Cluster规格</td>
</tr>
<tr>
<td>ExceedIdsLimit</td>
<td>-2967</td>
<td>文档主键超限</td>
</tr>
<tr>
<td>InvalidVectorType</td>
<td>-2968</td>
<td>无效向量类型</td>
</tr>
<tr>
<td>ExceedRequestSize</td>
<td>-2970</td>
<td>请求大小超限</td>
</tr>
<tr>
<td>EmptyClusterName</td>
<td>-2971</td>
<td>Cluster名称为空</td>
</tr>
<tr>
<td>EmptyVectorAndId</td>
<td>-2972</td>
<td>向量和主键同时为空</td>
</tr>
<tr>
<td>ExistVectorAndId</td>
<td>-2973</td>
<td>向量和主键都存在</td>
</tr>
<tr>
<td>TokenEmpty</td>
<td>-2976</td>
<td>ApiKey为空</td>
</tr>
<tr>
<td>TokenDelete</td>
<td>-2978</td>
<td>ApiKey已删除</td>
</tr>
<tr>
<td>TokenExpired</td>
<td>-2979</td>
<td>ApiKey过期</td>
</tr>
<tr>
<td>TokenDontExist</td>
<td>-2980</td>
<td>ApiKey不存在</td>
</tr>
<tr>
<td>DropPartitonFilter</td>
<td>-2992</td>
<td>禁止删除默认分区</td>
</tr>
<tr>
<td>InvalidDocId</td>
<td>-2994</td>
<td>无效文档主键</td>
</tr>
<tr>
<td>ExceedFieldLimit</td>
<td>-2995</td>
<td>文档字段超限</td>
</tr>
<tr>
<td>ExceedCollectionLimit</td>
<td>-2996</td>
<td>创建集合超限</td>
</tr>
<tr>
<td>ExceedPartitionLimit</td>
<td>-2997</td>
<td>创建分区超限</td>
</tr>
<tr>
<td>ExceedDocLimit</td>
<td>-2998</td>
<td>插入文本超限</td>
</tr>
<tr>
<td>InvalidArgument</td>
<td>-2999</td>
<td>无效参数</td>
</tr>
<tr>
<td>SystemError</td>
<td>-50000</td>
<td>系统错误</td>
</tr>
</tbody>
</table>
评论区