当前位置:   article > 正文

Milvus向量数据库基础用法及注意细节_pymilvus

pymilvus

1、Milvus数据类型与python对应的数据类型

Milvus

Python

DataType.INT64

numpy.int64

DataType.INT32

numpy.int32

DataType.INT16

numpy.int16

DataType.BOOL

Boolean

DataType.FLOAT

numpy.float32

DataType.DOUBLE

numpy.double

DataType.ARRAY

list

DataType.VARCHAR

str

DataType.JSON

dict

FLOAT_VECTOR(浮点数向量)

numpy.ndarray or list (元素为numpy.float)

2、python创建集合->构建索引->发布步骤

(1)连接向量数据库:

  1. from pymilvus import connections,db
  2. connections.connect("default",host="localhost",prot="19530")

(2)删除现有集合:

  1. from pymilvus import utility
  2. utility.drop_collection('ITEM_INFO')

(3)字段常用数据类型创建:

  1. from pymilvus import FieldSchema, DataType
  2. # 创建数据类型为INT64的主键,且主键ID自动递增
  3. ID_col = FieldSchema(
  4. name="ID",
  5. dtype=DataType.INT64,
  6. is_primary=True,
  7. description='主键、序号',
  8. auto_id=True)
  9. # 创建一个768维的浮点向量
  10. vec_col = FieldSchema(
  11. name="itemVec",
  12. dtype=DataType.FLOAT_VECTOR,
  13. dim=768,
  14. description = '向量')
  15. # 创建一个长度128维的字符串
  16. name_col = FieldSchema(
  17. name = 'itemName',
  18. dtype = DataType.VARCHAR,
  19. max_length = 128,
  20. description = '商品名称')
  21. # 创建double类型的浮点数
  22. price_col = FieldSchema(
  23. name = 'itemPrice',
  24. dtype = DataType.DOUBLE,
  25. description = '价格')
  26. # 创建json格式的字段
  27. keywords_col = FieldSchema(
  28. name = 'keywords',
  29. dtype = DataType.JSON)

(4)创建集合

  1. from pymilvus import CollectionSchema, Collection, connections
  2. # 集合所包含的字段
  3. schema = CollectionSchema(
  4. fields=[ID_col,vec_col,name_col,price_col,keywords_col],
  5. description="商品信息表",
  6. enable_dynamic_field=True
  7. )
  8. # 集合名称
  9. collection_name = "GOODS_INFO"
  10. # 构建集合后断开连接
  11. collection = Collection(
  12. name=collection_name,
  13. schema=schema,
  14. using='default',
  15. shards_num=2
  16. )
  17. connections.disconnect("default")

(5)构建索引

Milvus中构建索引的数据量最小为1024满足2的幂次方数据量不满1024时必须使用1024构建索引。

  1. from pymilvus import Collection
  2. # 连接集合
  3. collection = Collection("GOODS_INFO")
  4. # 构建索引所需的参数
  5. index_params = {
  6. "metric_type":"L2",
  7. "index_type":"IVF_FLAT",
  8. "params":{"nlist":1024}
  9. }
  10. # 在向量上构建索引
  11. collection.create_index(
  12. field_name="itemVec",
  13. index_params=index_params)

(6)发布集合

  1. from pymilvus import Collection, utility, connections
  2. # 连接集合
  3. collection = Collection("GOODS_INFO")
  4. # 发布集合
  5. collection.load()
  6. # 检查集合上线状态
  7. utility.load_state("GOODS_INFO")
  8. # 断开与向量数据库的连接
  9. connections.disconnect('default')

3、条件过滤

1、假设集合中有一字段A的数据类型为整型或浮点型,则可以

expr = 'A > 0 && A <= 10'

2、假设集合中有一字段A为任意数据类型,则可以

  1. # a,b,c,d为任意数据类型,可与A相同或不同
  2. expr = 'A in [a,b,c,d]'
  3. expr = 'A not in [a,b,c,d]'

3、假设集合中有一字段A为字符类型,则可以 # 在条件过滤中字符串要添加引号确定

  1. # 在条件过滤中字符串要添加引号确定
  2. expr = "A == 'Hello World!'"

4、假设集合中有一字段A为字符类型,则可以

  1. # 从A开头为123的向量中进行向量检索,目前milvus只支持字符前缀匹配,不支持'1%23''%123'
  2. expr = "A like '123%'"

5、假设集合中有一字段A为json类型,则可以

  1. # A = {"x": [1,2,3]}
  2. expr = 'json_contains(A["x"], 1)' # ==> true
  3. expr = 'json_contains(A["x"], "a")' # ==> false
  4. # A = {"x": [[1,2,3], [4,5,6], [7,8,9]]}
  5. expr = 'json_contains(A["x"], [1,2,3])' # ==> true
  6. expr = 'json_contains(A["x"], [3,2,1])' # ==> false
  7. # A = {"x": [1,2,3,4,5,7,8]}
  8. expr = 'json_contains_all(A["x"], [1,2,8])' # ==> true
  9. expr = 'json_contains_all(A["x"], [4,5,6])' # ==> false 6 is not exists
  10. # A = {"x": [1,2,3,4,5,7,8]}
  11. expr = 'json_contains_any(A["x"], [1,2,8])' # ==> true
  12. expr = 'json_contains_any(A["x"], [4,5,6])' # ==> true
  13. expr = 'json_contains_any(A["x"], [6,9])' # ==> false

6、假设集合中有一字段A为list类型,则可以

  1. # 该方法为上述方法2、的逆方法
  2. # A: [1,2,3]
  3. expr = 'array_contains(A, 1)' # ==> true
  4. expr = 'array_contains(A, "a")' # ==> false
  5. # A: [1,2,3,4,5,7,8]
  6. expr = 'array_contains_all(A, [1,2,8])' # ==> true
  7. expr = 'array_contains_all(A, [4,5,6])' # ==> false 6 is not exists
  8. # A: [1,2,3,4,5,7,8]
  9. expr = 'array_contains_any(A, [1,2,8])' # ==> true
  10. expr = 'array_contains_any(A, [4,5,6])' # ==> true
  11. expr = 'array_contains_any(A, [6,9])' # ==> false
  12. # A: [1,2,3,4,5,7,8]
  13. expr = 'array_length(int_array) == 7' # ==> true

假设有一集合,集合当中包含V、A、B、C四个字段:

V:浮点向量

A:向量的字符表达形式

B:A的属性1

C:A的属性2

现有一查询向量S、过滤条件E1和过滤条件E2(E1、E2均为列表),集合需要返回S与V相似度最高,且B包含于E1、C包含于E2的字符名称A。如果采用上述1、2、3、4方法中较基础的数据类型存表会导致查询速度和代码复杂度都较高。假设E1 = [1,2,3],E2 = [4,5,6],则对于同一条向量,需要做3 x 3 = 9次过滤。若使用5、6方法中的数据类型存表则可以将过滤次数降为2次。

例如

  1. # B和C为字符串类型
  2. expr = '(1 in B && 4 in C) or (1 in B && 5 in C) or (1 in B && 6 in C) ...'
  3. # B和C为keywords中的元素,keywords为json格式
  4. expr = "json_contains_any(keywords['B'], E1) && json_contains_any(keywords['C'], E2)"
  5. # B和C均为列表
  6. expr = "array_contains_any(B, E1) && json_contains_any(C, E2)"

4、查询

  1. from pymilvus import Collection, connections
  2. # 连接数据库,连接集合,将集合数据上传至内存
  3. connections.connect("default",host="localhost",prot="19530")
  4. knowledge = Collection('GOODS_INFO', using='default')
  5. knowledge.load()
  6. # 查询参数
  7. search_params = {
  8. "metric_type": "L2",
  9. "offset": 0,
  10. "ignore_growing": False,
  11. "params": {
  12. "nprobe": 10,
  13. # "radius": 10, # 对于L2,返回距离在[5,10)之间的向量
  14. # "range_filter": 5.0 # 对于IP,返回相似度在(0.8,1]之间的向量
  15. }
  16. }
  17. # 进行向量查询
  18. results = knowledge.search(
  19. data=query, #带查询向量
  20. anns_field='itemVec', #表中向量字段名称
  21. param=search_params, #查询参数
  22. limit=5, #返回数量
  23. expr=expr, #过滤条件,expr = None或''时,默认为不使用条件过滤
  24. output_fields=['itemName', 'itemPrice', 'keywords'] #返回的字段名称)
  25. # 断开数据库连接
  26. connections.remove_connection('default')

5、参考资料

Create a Collection Milvus documentation

声明:本文内容由网友自发贡献,不代表【wpsshop博客】立场,版权归原作者所有,本站不承担相应法律责任。如您发现有侵权的内容,请联系我们。转载请注明出处:https://www.wpsshop.cn/w/小小林熬夜学编程/article/detail/703148
推荐阅读
相关标签
  

闽ICP备14008679号