数据操作

http://router_server 代表router服务,$db_name是创建的库名, $space_name是创建的空间名, $id是数据记录的唯一id.

_id 是服务端生成的记录唯一标识,可以由用户指定,对数据的修改和删除需要使用该唯一标识。

$id 是插入数据时使用指定的值替换服务端生成的唯一标识,$id值不能使用url路径等特殊字符。若库中已存在该唯一标识的记录则更新覆盖。

插入 upsert接口

如果设置了主键_id,则将使用指定的主键。 如果未设置,则由 Vearch 生成。

如果插入时指定的_id已经存在,则更新现有数据; 否则,它将被插入。

当插入数据中的documents包含多条数据,则为批量插入,一般建议批量插入不超过100条。

插入和更新现在已经支持只传入部分字段的值,插入时只传入部分字段则必须包含向量字段,更新时无此限制。

插入时不指定唯一标识id

  1. curl -H "content-type: application/json" -XPOST -d'
  2. {
  3. "db_name": "ts_db",
  4. "space_name": "ts_space",
  5. "documents": [{
  6. "field_int": 90399,
  7. "field_float": 90399,
  8. "field_double": 90399,
  9. "field_string": "111399",
  10. "field_vector": {
  11. "feature": [...]
  12. }
  13. }, {
  14. "field_int": 45085,
  15. "field_float": 45085,
  16. "field_double": 45085,
  17. "field_string": "106085",
  18. "field_vector": {
  19. "feature": [...]
  20. }
  21. }, {
  22. "field_int": 52968,
  23. "field_float": 52968,
  24. "field_double": 52968,
  25. "field_string": "113968",
  26. "field_vector": {
  27. "feature": [...]
  28. }
  29. }]
  30. }
  31. ' http://router_server/document/upsert

field_vector是特征字段,其它字段为标量字段。所有字段名、值类型和定义表结构时保持一致。

插入时指定唯一标识

  1. curl -H "content-type: application/json" -XPOST -d'
  2. {
  3. "db_name": "ts_db",
  4. "space_name": "ts_space",
  5. "documents": [{
  6. "_id": "1000000",
  7. "field_int": 90399,
  8. "field_float": 90399,
  9. "field_double": 90399,
  10. "field_string": "111399",
  11. "field_vector": {
  12. "feature": [...]
  13. }
  14. }, {
  15. "_id": "1000001",
  16. "field_int": 45085,
  17. "field_float": 45085,
  18. "field_double": 45085,
  19. "field_string": "106085",
  20. "field_vector": {
  21. "feature": [...]
  22. }
  23. }, {
  24. "_id": "1000002",
  25. "field_int": 52968,
  26. "field_float": 52968,
  27. "field_double": 52968,
  28. "field_string": "113968",
  29. "field_vector": {
  30. "feature": [...]
  31. }
  32. }]
  33. }
  34. ' http://router_server/document/upsert

upsert接口返回值格式如下:

  1. {
  2. "code": 0,
  3. "msg": "success",
  4. "total": 3,
  5. "document_ids": [{
  6. "_id": "-526059949411103803",
  7. "status": 200,
  8. "error": "success"
  9. }, {
  10. "_id": "1287805132970120733",
  11. "status": 200,
  12. "error": "success"
  13. }, {
  14. "_id": "-1948185285365684656",
  15. "status": 200,
  16. "error": "success"
  17. }]
  18. }

total 标识插入成功的数量,document_ids返回生成的_id和插入结果信息。

精确查找 query接口

/document/query 接口用于精确查找与查询条件完全匹配的数据,查找时不包含向量数据。

支持两种方式:一种是直接通过主键获取文档,另一种是根据过滤条件获取对应的文档。

如果设置了partition_id,则获取指定数据分区上对应的文档。 此时document_id的含义就是该分区上的文档编号。

document_id可以是指定分区的[0, max_docid],max_docid和分区信息可以通过cluster/health接口获取。 可以通过这种方式获取集群的完整数据。

根据唯一id标识查找数据

  1. curl -H "content-type: application/json" -XPOST -d'
  2. {
  3. "db_name": "ts_db",
  4. "space_name": "ts_space",
  5. "query": {
  6. "document_ids": ["6560995651113580768", "-5621139761924822824", "-104688682735192253"]
  7. },
  8. "vector_value": true
  9. }
  10. ' http://router_server/document/query

获取指定数据分区上对应的文档,此时document_id可以是指定分区的[0, max_docid]

  1. curl -H "content-type: application/json" -XPOST -d'
  2. {
  3. "db_name": "ts_db",
  4. "space_name": "ts_space",
  5. "query": {
  6. "document_ids": [
  7. "10000",
  8. "10001",
  9. "10002"
  10. ],
  11. "partition_id": "1"
  12. },
  13. "vector_value": true
  14. }
  15. ' http://router_server/document/query

根据自定义的标量字段的 Filter 表达式查找

  1. curl -H "content-type: application/json" -XPOST -d'
  2. {
  3. "db_name": "ts_db",
  4. "space_name": "ts_space",
  5. "query": {
  6. "filter": [
  7. {
  8. "range": {
  9. "field_int": {
  10. "gte": 1000,
  11. "lte": 100000
  12. }
  13. }
  14. },
  15. {
  16. "term": {
  17. "field_string": [
  18. "322"
  19. ]
  20. }
  21. }
  22. ]
  23. },
  24. "vector_value": false
  25. }
  26. ' http://router_server/document/query

query接口返回格式

  1. {
  2. "code": 0,
  3. "msg": "success",
  4. "total": 3,
  5. "documents": [{
  6. "_id": "6560995651113580768",
  7. "_source": {
  8. "field_double": 202558,
  9. "field_float": 102558,
  10. "field_int": 1558,
  11. "field_string": "1558"
  12. }
  13. }, {
  14. "_id": "-5621139761924822824",
  15. "_source": {
  16. "field_double": 210887,
  17. "field_float": 110887,
  18. "field_int": 89887,
  19. "field_string": "89887"
  20. }
  21. }, {
  22. "_id": "-104688682735192253",
  23. "_source": {
  24. "field_double": 207588,
  25. "field_float": 107588,
  26. "field_int": 46588,
  27. "field_string": "46588"
  28. }
  29. }]
  30. }

query 接口参数说明:

字段标识

类型

是否必填

备注

document_ids

json数组

查询条件,filter和document_ids必须包含一项

partition_id

字符串

指定在哪个partition获取数据,与document_ids结合使用

filter

json数组

查询条件过滤: 数值过滤 + 标签过滤, filter和document_ids必须包含一项

fields

json数组

指定返回那些字段, 默认返回除向量字段外的所有字段

vector_value

bool

默认false,是否返回向量

size

int

指定返回结果数量,默认50

模糊查询 search接口

支持根据指定 id 或向量数值进行相似度检索,返回指定的 size 个最相似的 Document。

支持根据主键 id(Document ID)或向量数值,搭配自定义的标量字段的 Filter 表达式一并进行相似度检索。

document_ids传入唯一记录id,后台首先根据唯一id查询出该记录的特征,然后再用特征进行相似查询,返回匹配结果。

根据document_ids 查询

  1. curl -H "content-type: application/json" -XPOST -d'
  2. {
  3. "query": {
  4. "document_ids": [
  5. "3646866681750952826"
  6. ],
  7. "filter": [
  8. {
  9. "range": {
  10. "field_int": {
  11. "gte": 1000,
  12. "lte": 100000
  13. }
  14. }
  15. }
  16. ]
  17. },
  18. "retrieval_param": {
  19. "metric_type": "L2"
  20. },
  21. "size": 3,
  22. "db_name": "ts_db",
  23. "space_name": "ts_space"
  24. }
  25. ' http://router_server/document/search

根据向量查询 支持单条或者多条查询,多条可以将多个查询的特征拼接成一个特征数组(比如定义128维的特征,批量查询10条, 则将10个128维特征按顺序拼接成1280维特征数组赋值给feature字段), 后台接收到请求后按表结构定义的特征字段维度进行拆分,按顺序返回匹配结果。

  1. curl -H "content-type: application/json" -XPOST -d'
  2. {
  3. "query": {
  4. "vector": [
  5. {
  6. "field": "field_vector",
  7. "feature": [
  8. "..."
  9. ]
  10. }
  11. ],
  12. "filter": [
  13. {
  14. "range": {
  15. "field_int": {
  16. "gte": 1000,
  17. "lte": 100000
  18. }
  19. }
  20. }
  21. ]
  22. },
  23. "retrieval_param": {
  24. "metric_type": "L2"
  25. },
  26. "size": 3,
  27. "db_name": "ts_db",
  28. "space_name": "ts_space"
  29. }
  30. ' http://router_server/document/search

多向量查询 表空间定义时支持多个特征字段,因此查询时可以支持相应数据的特征进行查询。以每条记录两个向量为例:定义表结构字段

  1. {
  2. "field1": {
  3. "type": "vector",
  4. "dimension": 128
  5. },
  6. "field2": {
  7. "type": "vector",
  8. "dimension": 256
  9. }
  10. }

field1、field2均为向量字段,查询时搜索条件可以指定两个向量:

  1. {
  2. "query": {
  3. "vector": [{
  4. "field": "filed1",
  5. "feature": [0.1, 0.2, 0.3, 0.4, 0.5],
  6. "min_score": 0.9
  7. },
  8. {
  9. "field": "filed2",
  10. "feature": [0.8, 0.9],
  11. "min_score": 0.8
  12. }]
  13. }
  14. }

field1和field2过滤的结果求交集,其他参数及请求地址和普通查询一致。

search接口返回格式

  1. {
  2. "code": 0,
  3. "msg": "success",
  4. "documents": [
  5. [{
  6. "_id": "6979025510302030694",
  7. "_score": 16.55717658996582,
  8. "_source": {
  9. "field_double": 207598,
  10. "field_float": 107598,
  11. "field_int": 6598,
  12. "field_string": "6598"
  13. }
  14. }, {
  15. "_id": "-104688682735192253",
  16. "_score": 17.663991928100586,
  17. "_source": {
  18. "field_double": 207588,
  19. "field_float": 107588,
  20. "field_int": 46588,
  21. "field_string": "46588"
  22. }
  23. }, {
  24. "_id": "8549822044854277588",
  25. "_score": 17.88829803466797,
  26. "_source": {
  27. "field_double": 220413,
  28. "field_float": 120413,
  29. "field_int": 99413,
  30. "field_string": "99413"
  31. }
  32. }]
  33. ]
  34. }

查询参数整体json结构如下:

  1. {
  2. "query": {
  3. "vector": [],
  4. "filter": []
  5. },
  6. "retrieval_param": {"nprobe": 20},
  7. "fields": ["field1", "field2"],
  8. "is_brute_search": 0,
  9. "online_log_level": "debug",
  10. "quick": false,
  11. "vector_value": false,
  12. "load_balance": "leader",
  13. "l2_sqrt": false,
  14. "size": 10
  15. }

参数说明:

字段标识

类型

是否必填

备注

vector

json数组

查询特征,vector和document_ids必须包含一项

document_ids

json数组

查询特征,vector和document_ids必须包含一项

filter

json数组

查询条件过滤: 数值过滤 + 标签过滤

fields

json数组

指定返回那些字段, 默认只返回唯一id和分值

is_brute_search

int

默认0

online_log_level

string

值为debug, 开启打印调试日志

quick

bool

默认false

vector_value

bool

默认false,是否返回向量

load_balance

string

负载均衡算法,默认随机

l2_sqrt

bool

默认false,对l2距离计算结果开根号

sort

json数组

指定字段排序(只针对匹配结果,非整体)

size

int

指定返回结果数量,默认50

retrieval_param 参数指定模型计算时的参数,不同模型支持的参数不同,如下示例:

  • metric_type: 计算类型,支持InnerProduct和L2, 默认L2。

  • nprobe: 搜索桶数量。

  • recall_num: 召回数量,默认等于查询参数中size的值,设置从索引中搜索数量,然后计算size个最相近的值。

  • parallel_on_queries: 默认1, 搜索间并行;0代表桶间并行。

  • efSearch: 图遍历的距离。

IVFPQ:

  1. "retrieval_param": {
  2. "parallel_on_queries": 1,
  3. "recall_num" : 100,
  4. "nprobe": 80,
  5. "metric_type": "L2"
  6. }

GPU:

  1. "retrieval_param": {
  2. "recall_num" : 100,
  3. "nprobe": 80,
  4. "metric_type": "L2"
  5. }

HNSW:

  1. "retrieval_param": {
  2. "efSearch": 64,
  3. "metric_type": "L2"
  4. }

IVFFLAT:

  1. "retrieval_param": {
  2. "parallel_on_queries": 1,
  3. "nprobe": 80,
  4. "metric_type": "L2"
  5. }

FLAT:

  1. "retrieval_param": {
  2. "metric_type": "L2"
  3. }
  • vector json结构说明:
  1. "vector": [{
  2. "field": "field_name",
  3. "feature": [0.1, 0.2, 0.3, 0.4, 0.5],
  4. "min_score": 0.9,
  5. "boost": 0.5
  6. }]
  1. vector 支持多个(对应定义表结构时包含多个特征字段)。

  2. field 指定创建表时特征字段的名称。

  3. feature 传递特征,维数和定义表结构时维数必须相同。

  4. min_score 指定返回结果中分值必须大于等于0.9,两个向量计算结果相似度在0-1之间,min_score可以指定返回结果分值最小值,max_score可以指定最大值。如设置: “min_score”: 0.8,“max_score”: 0.95 代表过滤0.8<= 分值<= 0.95 的结果。同时另外一种分值过滤的方式是使用: “symbol”:”>=”,”value”:0.9 这种组合方式,symbol支持的值类型包含: > 、 >= 、 <、 <= 4种,value及min_score、max_score值在0到1之间。

  5. boost指定相似度的权重,比如两个向量相似度分值是0.7,boost设置成0.5之后,返回的结果中会将分值0.7乘以0.5即0.35,当单个向量时不生效。

  • filter json结构说明:
  1. "filter": [
  2. {
  3. "range": {
  4. "field_name": {
  5. "gte": 160,
  6. "lte": 180
  7. }
  8. }
  9. },
  10. {
  11. "term": {
  12. "field1": ["100", "200", "300"],
  13. "operator": "or"
  14. }
  15. },
  16. {
  17. "term": {
  18. "field2": ["a", "b", "c"],
  19. "operator": "and"
  20. }
  21. },
  22. {
  23. "term": {
  24. "field3": ["A1", "B2"],
  25. "operator": "not"
  26. }
  27. }
  28. ]
  1. filter 条件支持多个,多个条件之间是交的关系。

  2. range 指定使用数值字段integer、long、float、double 过滤, filed_name是数值字段名称, gte、lte指定范围, lte 小于等于, gte大于等于,若使用等值过滤,lte和gte设置相同的值。上述示例表示查询field_name字段大于等于160小于等于180区间的值。

  3. term 使用标签过滤(string字段), field1是定义的标签字段名,允许使用多个值过滤,可以求并“operator”: “or” , 求交: “operator”: “and”,不包含: “operator”: “not”。

  • is_brute_search 0使用索引搜索(建完索引前查询结果为空), 1使用暴力搜索,默认值0。

  • online_log_level 设置成”debug” 可以指定在服务端打印更加详细的日志,开发测试阶段方便排查问题。

  • quick 搜索结果默认将PQ召回向量进行计算和精排,为了加快服务端处理速度设置成true可以指定只召回,不做计算和精排。

  • vector_value 为了减小网络开销,搜索结果中默认不包含特征数据只包含标量信息字段,设置成true指定返回结果中包含原始特征数据。

  • load_balance leader,random,no_leader,least_connection,默认random。leader仅从主数据节点查询,random: 从ps主从节点随机选择,no_leader:只查询从节点,least_connection:最少连接数。

  • size 指定最多返回的结果数量。若请求url中设置了size值,优先使用url中指定的size值。

删除 delete接口

删除支持两种方法:指定document_ids和过滤条件。

删除指定document_ids

  1. curl -H "content-type: application/json" -XPOST -d'
  2. {
  3. "db_name": "ts_db",
  4. "space_name": "ts_space",
  5. "query": {
  6. "document_ids": ["4501743250723073467", "616335952940335471", "-2422965400649882823"]
  7. }
  8. }
  9. ' http://router_server/document/delete

删除满足过滤条件的文档,size指定每个数据分片删除的条数

  1. curl -H "content-type: application/json" -XPOST -d'
  2. {
  3. "db_name": "ts_db",
  4. "space_name": "ts_space",
  5. "query": {
  6. "filter": [
  7. {
  8. "range": {
  9. "field_int": {
  10. "gte": 1000,
  11. "lte": 100000
  12. }
  13. }
  14. },
  15. {
  16. "term": {
  17. "field_string": [
  18. "322"
  19. ]
  20. }
  21. }
  22. ]
  23. },
  24. "size": 3
  25. }
  26. ' http://router_server/document/delete

delete接口返回格式

  1. {
  2. "code": 0,
  3. "msg": "success",
  4. "total": 3,
  5. "document_ids": ["4501743250723073467", "616335952940335471", "-2422965400649882823"]
  6. }