有奖捉虫:行业应用 & 管理与支持文档专题 HOT
本章节介绍如何连接向量数据库写入数据,并进行第一次相似性检索。以 Linux 操作系统为例,使用 Python、Java、Go SDK 与 HTTP API 示例代码分别进行演示。运行本章节所提供的示例代码,您将初步了解向量数据库的检索能力。

导入 SDK 依赖模块

Python
Java
Go
import tcvectordb
from tcvectordb.model.enum import FieldType, IndexType, MetricType, ReadConsistency
from tcvectordb.model.index import Index, VectorIndex, FilterIndex, HNSWParams
from tcvectordb.model.collection import UpdateQuery
from tcvectordb.model.document import Document, SearchParams, Filter
import com.tencentcloudapi.client.VectorDBClient;
import com.tencentcloudapi.model.*;
package main
?
import (
"context"
"log"
"time"
?
"github.com/tencent/vectordatabase-sdk-go/tcvectordb"
)

创建 Client

导入 SDK 所需的模块之后,需先创建一个向量数据库的客户端对象,与向量数据库服务器连接才能进行交互。
说明:
如下示例 url key 需要分别替换为已购买的免费版实例的外网访问地址与 API Key。请登录 向量数据库控制台,在实例详情页面网络信息区域直接复制外网地址,密钥管理页面直接复制密钥。
Python
Java
Go
client = tcvectordb.VectorDBClient(url='http://10.0.X.X', username='root', key='eC4bLRy2va******************************', read_consistency=ReadConsistency.EVENTUAL_CONSISTENCY, timeout=30)
public class VectorDBExample {
public static void main(String[] args) {
// 创建VectorDB Client
ConnectParam connectParam = ConnectParam.newBuilder()
.withUrl("http://10.0.X.X:80")
.withUsername("root")
.withKey("eC4bLRy2va******************************")
.withTimeout(30)
.build();
VectorDBClient client = new VectorDBClient(connectParam, ReadConsistencyEnum.EVENTUAL_CONSISTENCY);
}
}
func main() {
var defaultOption = &tcvectordb.ClientOption{
Timeout: time.Second * 5,
MaxIdldConnPerHost: 2,
IdleConnTimeout: time.Minute,
ReadConsistency: tcvectordb.EventualConsistency,
}
client, err := tcvectordb.NewClient("http://10.0.X.X:80", "root", "eC4bLRy2va******************************", defaultOption)
if err != nil {
panic(err)
}
}

创建数据库

基于创建的客户端对象,创建数据库。
Python
Java
Go
Curl
Python SDK 通过 create_database() 接口创建数据库 db-test
db = client.create_database(database_name='db-test')
Java SDK 通过 createDatabase() 创建数据库 db-test
Database db = client.createDatabase("db-test");
Go SDK 通过 CreateDatabase() 创建数据库 db-test
var (
ctx = context.Background()
database = "db-test"
)
db, _ := client.CreateDatabase(ctx, database)
HTTP 使用 /database/create 接口创建数据库 db_test。如下示例,url 地址与 api_key 需要分别替换为已购买的免费版实例的外网地址与API Key。
curl -i -X POST \\
-H 'Content-Type: application/json' \\
-H 'Authorization: Bearer account=root&api_key=A5VOgsMpGWJhUI0WmUbY********************' \\
http://10.0.X.X:80/database/create \\
-d '{
"database": "db-test"
}'

创建集合

1. 创建集合之前,需先设计索引结构,指定索引字段。如下示例,创建一个可写入 3 维向量数据存储书籍的集合 book-vector,其书籍信息字段包括: idvectorbookName,分别对各字段构建索引。有关索引的具体信息,请参见 Index
主键索引(Primary Key Index):固定且必须,对应字段 id,每条数据的唯一标识。并对主键 id 构建 Filter 索引,以便可通过 id 的条件表达式进行特定行的检索。
向量索引(Vector Index):固定且必须,对应字段 vector,对向量数据构建索引,指定向量数据的维度、数据存储的索引类型、相似性计算方法及相关索引参数。
Filter 索引(Filter Index):需根据检索需求选取可作为条件查询过滤数据的字段。通常,向量数据对应的文本字段,不具有过滤属性,则无需对该字段建立索引,否则,将浪费较大的内存也无实际意义。如下示例,预按书籍的名称过滤数据,对 bookName 字段建立 Filter 索引。
2. 创建集合,免费测试版实例,其分片 shard 只能为 1,副本 replicas 仅能为 0。
Python
Java
Go
Curl
Python SDK 通过接口 create_collection() 创建集合 book-vector
index = Index(
FilterIndex(name='id', field_type=FieldType.String, index_type=IndexType.PRIMARY_KEY),
VectorIndex(name='vector', dimension=3, index_type=IndexType.HNSW,
metric_type=MetricType.COSINE, params=HNSWParams(m=16, efconstruction=200)),
FilterIndex(name='bookName', field_type=FieldType.String, index_type=IndexType.FILTER)
)
# create a collection
# 免费测试版实例,其分片 shard 只能为 1,副本 replicas 仅能为 0。
coll = db.create_collection(
name='book-vector',
shard=1,
replicas=0,
description='this is a collection book vector',
index=index
)
print(vars(coll))
Java SDK 通过接口 createCollection 创建集合 book-vector
// 免费测试版实例,其分片 shard 只能为 1,副本 replicas 仅能为 0。
CreateCollectionParam collectionParam = CreateCollectionParam.newBuilder()
.withName("book-vector")
.withShardNum(1)
.withReplicaNum(0)
.withDescription("this is a collection book vector")
.addField(new FilterIndex("id", FieldType.String, IndexType.PRIMARY_KEY))
.addField(new VectorIndex("vector", 3, IndexType.HNSW,
MetricType.COSINE, new HNSWParams(16, 200)))
.addField(new FilterIndex("bookName", FieldType.String, IndexType.FILTER))
.build();
Collection collection = db.createCollection(collectionParam);
Go SDK 通过接口 CreateCollection() 创建集合 book-vector
var (
ctx = context.Background()
database = "db-test"
collectionName = "book-vector"
)
index := tcvectordb.Indexes{
VectorIndex: []tcvectordb.VectorIndex{
{
Dimension: 3,
FilterIndex: tcvectordb.FilterIndex{
FieldName: "vector",
FieldType: tcvectordb.Vector,
IndexType: tcvectordb.HNSW,
},
MetricType: tcvectordb.COSINE,
Params: &tcvectordb.HNSWParam{
M: 16,
EfConstruction: 200,
},
},
},
FilterIndex: []tcvectordb.FilterIndex{
{
FieldName: "id",
FieldType: tcvectordb.String,
IndexType: tcvectordb.PRIMARY,
},
{
FieldName: "bookName",
FieldType: tcvectordb.String,
IndexType: tcvectordb.FILTER,
},
},
}
?
// 免费测试版实例,其分片 shard 只能为 1,副本 replicas 仅能为 0。
coll, _ := db.CreateCollection(ctx, collectionName, 1, 0, "this is a collection book vector", index)
log.Printf("CreateCollection success: %v: %v", coll.DatabaseName, coll.CollectionName)
HTTP 通过 /collection/create 创建集合 book-vector 。免费测试版实例,其分片 shard 只能为 1,副本 replicas 仅能为 0。
curl -i -X POST \\
-H 'Content-Type: application/json' \\
-H 'Authorization: Bearer account=root&api_key=A5VOgsMpGWJhUI0WmUbY********************' \\
http://10.0.X.X:80/collection/create \\
-d '{
"database": "db-test",
"collection": "book-vector",
"replicaNum": 0,
"shardNum": 1,
"description": "this is a collection book vector",
"indexes": [
{
"fieldName": "id",
"fieldType": "string",
"indexType": "primaryKey"
},
{
"fieldName": "vector",
"fieldType": "vector",
"indexType": "HNSW",
"dimension": 3,
"metricType": "COSINE",
"params": {
"M": 16,
"efConstruction": 200
}
},
{
"fieldName": "bookName",
"fieldType": "string",
"indexType": "filter"
}
]
}'

插入数据

如下示例,为书籍集合 book-vector 写入3条数据。
说明:
向量数据库支持动态 Schema,写入数据时可以写入任何字段,无需提前定义,类似 MongoDB。如下示例,page 与 author 为新定义的书籍信息字段。
创建集合时,并未对 page 与 author 构建 Filter 索引,因此,二者不具有过滤属性,仅 bookName 具有过滤属性。
Python
Java
Go
Curl
Python SDK 通过接口 upsert() 为集合 book-vector 写入向量数据。
res = coll.upsert(
documents=[
Document(id='0001', vector=[
0.2123, 0.23, 0.213], author='罗贯中', bookName='三国演义', page=21),
Document(id='0002', vector=[
0.2123, 0.22, 0.213], author='吴承恩', bookName='西游记', page=22),
Document(id='0003', vector=[
0.2123, 0.21, 0.213], author='曹雪芹', bookName='红楼梦', page=23)
]
)
Java SDK 通过 upsert() 接口为集合 book-vector 批量插入数据。
Document doc1 = Document.newBuilder()
.withId("0001")
.withVector(Arrays.asList(0.2123, 0.23, 0.213))
.addDocField(new DocField("bookName", "三国演义"))
.addDocField(new DocField("author", "吴承恩"))
.addDocField(new DocField("page", 21))
.build();
Document doc2 = Document.newBuilder()
.withId("0002")
.withVector(Arrays.asList(0.2123, 0.22, 0.213))
.addDocField(new DocField("bookName", "西游记"))
.addDocField(new DocField("author", "吴承恩"))
.addDocField(new DocField("page", 22))
.build();
Document doc3 = Document.newBuilder()
.withId("0003")
.withVector(Arrays.asList(0.2123, 0.21, 0.213))
.addDocField(new DocField("bookName", "红楼梦"))
.addDocField(new DocField("author", "曹雪芹"))
.addDocField(new DocField("page", 23))
.build();
InsertParam insertParam = InsertParam.newBuilder()
.addDocument(doc1)
.addDocument(doc2)
.addDocument(doc3)
.build();
collection.upsert(insertParam);
Go SDK 通过 Upsert() 接口为集合 book-vector 批量插入数据。
result, err := coll.Upsert(ctx, []tcvectordb.Document{
{
Id: "0001",
Vector: []float32{0.2123, 0.23, 0.213},
Fields: map[string]tcvectordb.Field{
"bookName": {Val: "三国演义"},
"author": {Val: "罗贯中"},
"page": {Val: 21},
},
},
{
Id: "0002",
Vector: []float32{0.2123, 0.22, 0.213},
Fields: map[string]tcvectordb.Field{
"bookName": {Val: "西游记"},
"author": {Val: "吴承恩"},
"page": {Val: 22},
},
},
{
Id: "0003",
Vector: []float32{0.2123, 0.21, 0.213},
Fields: map[string]tcvectordb.Field{
"bookName": {Val: "红楼梦"},
"author": {Val: "曹雪芹"},
"page": {Val: 23},
},
},
}, &tcvectordb.UpsertDocumentParams{})
?
log.Printf("upsert result: %+v", result)
如下示例,通过 /document/upsert 给集合 book-vector 批量插入数据。插入数据以 Document 为最小单元,插入3 个 Document。
curl -i -X POST \\
-H 'Content-Type: application/json' \\
-H 'Authorization: Bearer account=root&api_key=A5VOgsMpGWJhUI0WmUbY********************' \\
http://10.0.X.X:80/document/upsert \\
-d '{
"database": "db-test",
"collection": "book-vector",
"documents": [
{
"id": "0001",
"vector": [
0.2123,
0.23,
0.213
],
"author": "罗贯中",
"bookName": "三国演义",
"page": 21
},
{
"id": "0002",
"vector": [
0.2123,
0.22,
0.213
],
"author": "吴承恩",
"bookName": "西游记",
"page": 22
},
{
"id": "0003",
"vector": [
0.2123,
0.21,
0.213
],
"author": "曹雪芹",
"bookName": "红楼梦",
"page": 23
}
]
}'
执行成功,返回如下信息:
{
"code": 0,
"msg": "operation success",
"affectedCount": 3
}

相似性检索

?相似度检索 是基于向量数据之间的相似度计算方法来检索与查询向量最相似的数据。
Python
Java
Go
Curl

检索与输入向量数据相似的数据

Python SDK 提供了 search() 按照 Vector 搜索的能力,可根据指定的多个向量查找 TopK 个相似性结果。 如下示例,检索与 vectors 字段指定的三组向量数据分别相似,且满足 bookName 条件表达式的 Top3 数据。
# 1. vectors 指定了需检索的向量数据。
# 2. filter 指定了 bookName 字段的条件表达式,过滤数据。
# 3. limit 限制每个单元返回的相似性数据的条数,如 vector 写入三组向量数据,limit 为3,则每组向量返回 top3 的相似数据。
# 4. params 指定索引类型对应的查询参数,HNSW 类型需要设置 ef,指定查询的遍历范围。
doc_lists = coll.search(
vectors=[[0.3123, 0.43, 0.213],[0.315, 0.4, 0.216],[0.40, 0.38, 0.26]],
filter=Filter(Filter.In("bookName",["三国演义", "西游记"])),
params=SearchParams(ef=200),
limit=3
)
for i, docs in enumerate(doc_lists):
print(i)
for doc in docs:
print(doc)
检索结果,如下所示。
说明:
输出结果的顺序,与搜索时设置的 vectors 配置的向量值的顺序一致。如下示例,0下面的三行结果对应[0.3123, 0.43, 0.213]向量的相似度查询结果。1下面的三行结果对应[0.315, 0.4, 0.216]的查询结果。
每一个查询结果都返回 TopK 条相似度计算的结果。其中,K为 limit 设置的数值,如果插入的数据不足 K 条,则返回实际检索到的 Document 数量。
检索结果会按照与查询向量的相似程度进行排列,相似度最高的结果会排在最前面,相似度最低的结果则排在最后面。相似程度则通过 L2(欧几里得距离)、IP(内积)或 COSINE(余弦相似度)计算得出的分数来衡量,输出参数 score 表示相似性计算分数。其中,欧式距离(L2)计算所得的分数越小与搜索值越相似;而余弦相似度(COSINE)与 内积(IP) 计算所得的分数越大与搜索值越相似。
0
{'id': '0001', 'score': 0.971423, 'bookName': '三国演义', 'page': 21, 'author': '罗贯中'}
{'id': '0002', 'score': 0.966884, 'author': '吴承恩', 'page': 22, 'bookName': '西游记'}
1
{'id': '0001', 'score': 0.978463, 'page': 21, 'bookName': '三国演义', 'author': '罗贯中'}
{'id': '0002', 'score': 0.974783, 'author': '吴承恩', 'bookName': '西游记', 'page': 22}
2
{'id': '0001', 'score': 0.986069, 'bookName': '三国演义', 'page': 21, 'author': '罗贯中'}
{'id': '0002', 'score': 0.985201, 'author': '吴承恩', 'bookName': '西游记', 'page': 22}

检索与指定 Document ID 相似的数据

Python SDK 还提供了searchById() 按 id 检索的能力。如下示例,检索与 id(Document ID)为0001、0002 分别相似,且满足 bookName 条件表达式相似度最高的 Top3 数据。
# 1. document_ids 指定了需检索文档的 id。
# 2. filter 指定了 bookName 字段的条件表达式,过滤数据。
# 3. limit 限制每个单元返回的相似性数据的条数,如 document_ids 传入2个数据 id,limit 为 3,则返回每个 id 相似的 top3 向量。
# 4. params 指定索引类型对应的查询参数。HNSW 类型需要设置 ef,指定查询的遍历范围。
doc_lists = coll.searchById(
document_ids=['0001','0002'],
filter=Filter(Filter.In("bookName",["三国演义", "西游记"])),
params=SearchParams(ef=200),
limit=3
)
for i, docs in enumerate(doc_lists):
print(i)
for doc in docs:
print(doc)
查看输出,如下所示。
说明:
输出的 Document ID 顺序与查询时配置的参数 document_ids 输入的顺序一致。查询结果中0下面的三行为 id 为0001进行相似度查询的结果,1下面的三行为 id 为0002进行相似度查询的结果。
0
{'id': '0001', 'score': 1.0, 'author': '罗贯中', 'bookName': '三国演义', 'page': 21}
{'id': '0002', 'score': 0.999773, 'page': 22, 'author': '吴承恩', 'bookName': '西游记'}
1
{'id': '0002', 'score': 1.0, 'author': '吴承恩', 'bookName': '西游记', 'page': 22}
{'id': '0001', 'score': 0.999773, 'bookName': '三国演义', 'page': 21, 'author': '罗贯中'}

检索与输入向量相似的数据

Java SDK 提供了 search() 接口按照 Vector 搜索的能力。如下示例,检索与 Vectors 字段指定的三组向量数据分别相似,且满足 bookName 条件表达式的 Top3 条数据。
SearchByVectorParam searchByVectorParam = SearchByVectorParam.newBuilder()
// Vectors 指定了需检索的向量数据
.withVectors(Arrays.asList(Arrays.asList(0.3123, 0.43, 0.213), Arrays.asList(0.315, 0.4, 0.216), Arrays.asList(0.40, 0.38, 0.26)))
// 若使用 HNSW 索引,则需要指定参数 ef,ef 越大,召回率越高,但也会影响检索速度
.withParams(new HNSWSearchParams(200))
// 指定返回的最相似的 Top K 的 K 值
.withLimit(3)
// 设置标量字段的 Filter 表达式,过滤所需查询的文档
.withFilter(new Filter(Filter.in("bookName", Arrays.asList("三国演义","西游记"))))
.build();
// 输出相似度检索结果
List<List<Document>> svDocs = collection.search(searchByVectorParam);
int i = 0;
for (List<Document> docs : svDocs) {
System.out.println("\\tres: " + i++);
for (Document doc : docs) {
System.out.println("\\tres: " + doc.toString());
}
}
检索结果,如下所示。
说明:
输出数组的 Document 顺序与搜索时设置的 Vectors 配置的向量值的顺序一致。
每一个查询结果都返回 TopK 条相似度计算的结果。其中,K 为 limit 设置的数值,如果检索的数据不足 K 条,则返回实际检索到的 Document 数量。
检索结果会按照与查询向量的相似程度进行排列,相似度最高的结果会排在最前面,相似度最低的结果则排在最后面。相似程度则通过 L2(欧几里得距离)、IP(内积)或 COSINE(余弦相似度)计算得出的分数来衡量,输出参数 score 表示相似性计算分数。其中,欧式距离(L2)计算所得的分数越小与搜索值越相似;而余弦相似度(COSINE)与 内积(IP) 计算所得的分数越大与搜索值越相似。
res: 0 res: {"id":"0001","score":0.971423,"page":21,"bookName":"三国演义","author":"吴承恩"} res: {"id":"0002","score":0.966884,"bookName":"西游记","page":22,"author":"吴承恩"} res: 1 res: {"id":"0001","score":0.978463,"page":21,"author":"吴承恩","bookName":"三国演义"} res: {"id":"0002","score":0.974783,"bookName":"西游记","page":22,"author":"吴承恩"} res: 2 res: {"id":"0001","score":0.986069,"bookName":"三国演义","author":"吴承恩","page":21} res: {"id":"0002","score":0.985201,"author":"吴承恩","bookName":"西游记","page":22}

根据 ID 进行相似度检索

Java SDK 还提供了 searchById() 接口按 id 检索的能力。如下示例,检索与 id(Document ID)为 0001、0002分别相似,且满足 bookName 条件表达式的 Top3 条数据。
SearchByIdParam searchByIdParam = SearchByIdParam.newBuilder()
.withDocumentIds(Arrays.asList("0001", "0002"))
// 若使用 HNSW 索引,则需要指定参数 ef,ef 越大,召回率越高,但也会影响检索速度
.withParams(new HNSWSearchParams(200))
// 指定 Top K 的 K 值
.withLimit(3)
// 使用 filter 过滤数据
.withFilter(new Filter(Filter.in("bookName", Arrays.asList("三国演义","西游记"))))
.build();
List<List<Document>> siDocs = collection.searchById(searchByIdParam);
int i = 0;
for (List<Document> docs : siDocs) {
System.out.println("\\tres: " + i++);
for (Document doc : docs) {
System.out.println("\\tres: " + doc.toString());
}
}
检索结果,如下所示。
说明:
输出数组的 Document 顺序与查询时配置的参数 DocumentIds 输入的顺序一致。如下 documents 中第一个中括号为 id 为 0001的相似数据,第二个中括号为 id 为 0002 的相似数据。
res: 0 res: {"id":"0001","score":1.0,"bookName":"三国演义","page":21,"author":"吴承恩"} res: {"id":"0002","score":0.999773,"author":"吴承恩","bookName":"西游记","page":22} res: 1 res: {"id":"0002","score":1.0,"author":"吴承恩","bookName":"西游记","page":22} res: {"id":"0001","score":0.999773,"bookName":"三国演义","author":"吴承恩","page":21}

检索与输入向量相似的数据

Go SDK 提供了 Search() 接口按照 Vector 搜索的能力。如下示例,检索与指定的三组向量数据分别相似,且满足 bookName 条件表达式的 Top3 条数据。
filter := tcvectordb.NewFilter(`bookName in ("三国演义","西游记")`)
searchRes, _ := coll.Search(ctx, [][]float32{
{0.3123, 0.43, 0.213},
{0.315, 0.4, 0.216},
{0.40, 0.38, 0.26},
}, &tcvectordb.SearchDocumentParams{
Filter: filter,
Params: &tcvectordb.SearchDocParams{Ef: 200},
Limit: 3,
})
for i, docs := range searchRes.Documents {
log.Printf("doc %d result: ", i)
for _, doc := range docs {
log.Printf("document: %+v", doc)
}
}
检索结果,如下所示。
说明:
输出数组的 Document 顺序与查询时配置的向量数据的顺序一致。
每一个查询结果都返回 TopK 条相似度计算的结果。其中,K 为 limit 设置的数值,如果检索的数据不足 K 条,则返回实际检索到的 Document 数量。
检索结果会按照与查询向量的相似程度进行排列,相似度最高的结果会排在最前面,相似度最低的结果则排在最后面。相似程度则通过 L2(欧几里得距离)、IP(内积)或 COSINE(余弦相似度)计算得出的分数来衡量,输出参数 Score 表示相似性计算分数。其中,欧式距离(L2)计算所得的分数越小与搜索值越相似;而余弦相似度(COSINE)与 内积(IP) 计算所得的分数越大与搜索值越相似。
2024/01/03 17:19:11 doc 0 result:
2024/01/03 17:21:29 document: {Id:0001 Vector:[] Score:0.971423 Fields:map[author:罗贯中 bookName:三国演义 page:21]}
2024/01/03 17:21:29 document: {Id:0002 Vector:[] Score:0.966884 Fields:map[author:吴承恩 bookName:西游记 page:22]}
2024/01/03 17:21:29 doc 1 result:
2024/01/03 17:21:29 document: {Id:0001 Vector:[] Score:0.978463 Fields:map[author:罗贯中 bookName:三国演义 page:21]}
2024/01/03 17:21:29 document: {Id:0002 Vector:[] Score:0.974783 Fields:map[author:吴承恩 bookName:西游记 page:22]}
2024/01/03 17:21:29 doc 2 result:
2024/01/03 17:21:29 document: {Id:0001 Vector:[] Score:0.986069 Fields:map[author:罗贯中 bookName:三国演义 page:21]}
2024/01/03 17:21:29 document: {Id:0002 Vector:[] Score:0.985201 Fields:map[author:吴承恩 bookName:西游记 page:22]}

检索与指定 id 相似的数据

Go SDK 还提供了 SearchById() 接口按 id 检索的能力。如下示例,检索与 id(Document ID)为 0001、0002分别相似,且满足 bookName 条件表达式的 Top3 条数据。
documentId := []string{"0001", "0002"}
filter := tcvectordb.NewFilter(`bookName in ("三国演义","西游记")`)
searchRes, err := coll.SearchById(ctx, documentId, &tcvectordb.SearchDocumentParams{
Filter: filter,
Params: &tcvectordb.SearchDocParams{Ef: 200},
Limit: 3,
})
for i, docs := range searchRes.Documents {
log.Printf("doc %d result: ", i)
for _, doc := range docs {
log.Printf("document: %+v", doc)
}
}
检索结果,如下所示。
2024/01/03 17:24:27 doc 0 result:
2024/01/03 17:24:27 document: {Id:0001 Vector:[] Score:1 Fields:map[author:罗贯中 bookName:三国演义 page:21]}
2024/01/03 17:24:27 document: {Id:0002 Vector:[] Score:0.999773 Fields:map[author:吴承恩 bookName:西游记 page:22]}
2024/01/03 17:24:27 doc 1 result:
2024/01/03 17:24:27 document: {Id:0002 Vector:[] Score:1 Fields:map[author:吴承恩 bookName:西游记 page:22]}
2024/01/03 17:24:27 document: {Id:0001 Vector:[] Score:0.999773 Fields:map[author:罗贯中 bookName:三国演义 page:21]}

检索与输入向量相似的数据

HTTP 支持 /document/search 接口按照 Vector 检索的能力,查询与指定向量 vectors 字段相似的数据。如下示例,检索与指定的三组向量数据分别相似,且满足 bookName 条件表达式的 Top3 条数据。
curl -i -X POST \\
-H 'Content-Type: application/json' \\
-H 'Authorization: Bearer account=root&api_key=A5VOgsMpGWJhUI0WmUbY********************' \\
http://10.0.X.X:80/document/search \\
-d '{
"database": "db-test",
"collection": "book-vector",
"search": {
"vectors": [
[
0.3123,
0.43,
0.213
],
[
0.315,
0.4,
0.216
],
[
0.40,
0.38,
0.26
]
],
"params": {
"ef": 200
},
"filter": "bookName in (\\"三国演义\\",\\"西游记\\")",
"limit": 3
}
}'
?
执行成功,返回如下信息:
说明:
输出数组的 Document 顺序与查询时配置的参数 vectors输入的顺序一致。
每一个查询结果都返回 TopK 条相似度计算的结果。其中,K 为 limit 设置的数值,如果检索的数据不足 K 条,则返回实际的 Document 数量。
检索结果会按照与查询向量的相似程度进行排列,相似度最高的结果会排在最前面,相似度最低的结果则排在最后面。相似程度则通过 L2(欧几里得距离)、IP(内积)或 COSINE(余弦相似度)计算得出的分数来衡量,输出参数 score 表示相似性计算分数。其中,欧式距离(L2)计算所得的分数越小与搜索值越相似;而余弦相似度(COSINE)与 内积(IP) 计算所得的分数越大与搜索值越相似。
{
"code": 0,
"msg": "operation success",
"documents": [
[
{
"id": "0001",
"score": 0.971423,
"page": 21,
"author": "罗贯中",
"bookName": "三国演义"
},
{
"id": "0002",
"score": 0.966884,
"author": "吴承恩",
"page": 22,
"bookName": "西游记"
}
],
[
{
"id": "0001",
"score": 0.978463,
"author": "罗贯中",
"bookName": "三国演义",
"page": 21
},
{
"id": "0002",
"score": 0.974783,
"page": 22,
"bookName": "西游记",
"author": "吴承恩"
}
],
[
{
"id": "0001",
"score": 0.986069,
"bookName": "三国演义",
"author": "罗贯中",
"page": 21
},
{
"id": "0002",
"score": 0.985201,
"author": "吴承恩",
"page": 22,
"bookName": "西游记"
}
]
]
}

检索与指定 ID 相似的数据

HTTP 还提供了 /document/search按 id 检索的能力。如下示例,检索与 id(Document ID)为 0001、0002分别相似,且满足 bookName 条件表达式的 Top3 条数据。
curl -i -X POST \\
-H 'Content-Type: application/json' \\
-H 'Authorization: Bearer account=root&api_key=A5VOgsMpGWJhUI0WmUbY********************' \\
http://10.0.X.X:80/document/search \\
-d '{
"database": "db-test",
"collection": "book-vector",
"search": {
"documentIds": [
"0001",
"0002"
],
"params": {
"ef": 200
},
"retrieveVector": true,
"filter": "bookName in (\\"三国演义\\",\\"西游记\\")",
"limit": 3
}
}'
执行成功,返回如下信息:
说明:
输出数组的 Document 顺序与查询时配置的参数 documentIds 输入 id 的顺序一致。如下 documents 中第一个中括号为 id 为 0001的相似数据,第二个中括号为 id 为 0002 的相似数据。
{
"code": 0,
"msg": "operation success",
"documents": [
[
{
"id": "0001",
"score": 1.0,
"bookName": "三国演义",
"author": "罗贯中",
"page": 21
},
{
"id": "0002",
"score": 0.999773,
"page": 22,
"bookName": "西游记",
"author": "吴承恩"
}
],
[
{
"id": "0002",
"score": 1.0,
"page": 22,
"author": "吴承恩",
"bookName": "西游记"
},
{
"id": "0001",
"score": 0.999773,
"page": 21,
"author": "罗贯中",
"bookName": "三国演义"
}
]
]
}

删除数据库

Python
Java
Go
Curl
Python SDK 通过 drop_database() 接口删除数据库 db-test
client.drop_database(database_name='db-test')
Java SDK 通过 dropDatabase() 删除数据库 db-test
client.dropDatabase("db-test");
Go SDK 通过 DropDatabase() 删除数据库 db-test
result, _ := client.DropDatabase(context.Background(), database)
HTTP 使用 /database/drop 接口删除数据库 db_test。如下示例,url 地址与 api_key 需要分别替换为已购买的免费版实例的外网地址与API Key。
curl -i -X POST \\
-H 'Content-Type: application/json' \\
-H 'Authorization: Bearer account=root&api_key=A5VOgsMpGWJhUI0WmUbY********************' \\
http://10.0.X.X:80/database/drop \\
-d '{
"database": "db-test"
}'
?


http://www.vxiaotou.com