本章节介绍如何连接向量数据库写入数据,并进行第一次相似性检索。以 Linux 操作系统为例,使用 Python、Java、Go SDK 与 HTTP API 示例代码分别进行演示。运行本章节所提供的示例代码,您将初步了解向量数据库的检索能力。
导入 SDK 依赖模块
import tcvectordbfrom tcvectordb.model.enum import FieldType, IndexType, MetricType, ReadConsistencyfrom tcvectordb.model.index import Index, VectorIndex, FilterIndex, HNSWParamsfrom tcvectordb.model.collection import UpdateQueryfrom tcvectordb.model.document import Document, SearchParams, Filter
import com.tencentcloudapi.client.VectorDBClient;import com.tencentcloudapi.model.*;
package mainimport ("context""log""time""github.com/tencent/vectordatabase-sdk-go/tcvectordb")
创建 Client
导入 SDK 所需的模块之后,需先创建一个向量数据库的客户端对象,与向量数据库服务器连接才能进行交互。
说明:
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 ClientConnectParam 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)}}
创建数据库
基于创建的客户端对象,创建数据库。
db = client.create_database(database_name='db-test')
Database db = client.createDatabase("db-test");
var (ctx = context.Background()database = "db-test")db, _ := client.CreateDatabase(ctx, database)
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,其书籍信息字段包括: id、vector、bookName,分别对各字段构建索引。有关索引的具体信息,请参见 Index。
主键索引(Primary Key Index):固定且必须,对应字段 id,每条数据的唯一标识。并对主键 id 构建 Filter 索引,以便可通过 id 的条件表达式进行特定行的检索。
向量索引(Vector Index):固定且必须,对应字段 vector,对向量数据构建索引,指定向量数据的维度、数据存储的索引类型、相似性计算方法及相关索引参数。
Filter 索引(Filter Index):需根据检索需求选取可作为条件查询过滤数据的字段。通常,向量数据对应的文本字段,不具有过滤属性,则无需对该字段建立索引,否则,将浪费较大的内存也无实际意义。如下示例,预按书籍的名称过滤数据,对 bookName 字段建立 Filter 索引。
2. 创建集合,高可用默认规格实例,其分片 shard 可为 1,副本 replicas 可为 1。
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 collectioncoll = db.create_collection(name='book-vector',shard=1,replicas=1,description='this is a collection book vector',index=index)print(vars(coll
CreateCollectionParam collectionParam = CreateCollectionParam.newBuilder().withName("book-vector").withShardNum(1).withReplicaNum(1).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);
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,},},}coll, _ := db.CreateCollection(ctx, collectionName, 1, 1, "this is a collection book vector", index)log.Printf("CreateCollection success: %v: %v", coll.DatabaseName, coll.CollectionName
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": 1,"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 具有过滤属性。
res = client.upsert(database_name='db-test',collection_name='book-vector',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)])
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();private static final String DBNAME = "db-test";private static final String COLL_NAME = "book-vector";AffectRes affectRes = client.upsert(DBNAME, COLL_NAME, insertParam);System.out.println("\\tres: " + affectRes);
result, err := client.Upsert(ctx, database, collectionName, []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)
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 SDK 提供了 search() 按照 Vector 搜索的能力,可根据指定的多个向量查找 TopK 个相似性结果。 如下示例,检索与 vectors 字段指定的三组向量数据分别相似,且满足 bookName 条件表达式的 Top3 数据。
# 1. vectors 指定了需检索的向量数据。# 2. filter 指定了 bookName 字段的条件表达式,过滤数据。# 3. limit 限制每个单元返回的相似性数据的条数,如 vector 写入三组向量数据,limit 为3,则每组向量返回 top3 的相似数据。# 4. params 指定索引类型对应的查询参数,HNSW 类型需要设置 ef,指定查询的遍历范围。doc_lists = client.search(database_name='db-test',collection_name='book-vector',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 = client.searchById(database_name='db-test',collection_name='book-vector',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
(
)
;
// 输出相似度检索结果
private static final String DBNAME = "db-test";private static final String COLL_NAME = "book-vector";List<List<Document>> svDocs = client.search(DBNAME, COLL_NAME, 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();private static final String DBNAME = "db-test";private static final String COLL_NAME = "book-vector";List<List<Document>> siDocs = client.searchById(DBNAME, COLL_NAME, 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}
检索与输入向量相似的数据
filter := tcvectordb.NewFilter(`bookName in ("三国演义","西游记")`)searchRes, _ := client.Search(ctx, database, collectionName, [][]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 := client.SearchById(ctx, database, collectionName, 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": "三国演义"}]]}
删除数据库
client.drop_database(database_name='db-test')
client.dropDatabase("db-test");
result, _ := client.DropDatabase(context.Background(), database)
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"