1 概述
本文将通过 Qdrant 的 python 客户端库 qdrant-client 来简单操作一下 Qdrant 向量数据库。
2 Qdrant 的使用
2.1 引入 Qdrant 的 python 客户端库
引入 qdrant_client 版本 为 1.10.1 的 Qdrant 的 python 客户端库。
pip install qdrant-client
2.2 创建和启动 Qdrant 数据库
项目启动时,创建并启动一个Qdrant数据库,数据持久化到磁盘,数据存储地址为“/Users/Shared/data/qdrant”。
from qdrant_client import QdrantClient
client = QdrantClient(path="/Users/Shared/data/qdrant")
2.3 创建数据集
创建一个名称为 test_collection 的数据集(类似于mysql中的表)。其中向量维度为4维,相似度计算方式使用向量点积相似度-Distance.DOT。
from qdrant_client.models import Distance, VectorParams
def create_collection():
client.create_collection(
collection_name="test_collection",
vectors_config=VectorParams(size=4, distance=Distance.DOT),
)
2.4 新增向量数据
往 test_collection 数据集中新增向量数据。其中 vector 为向量数据对应的向量,payload 为向量数据对应的负载,是附加在向量上的数据,在搜索过程中可用于过滤或排序结果。
from qdrant_client.models import PointStruct
def add_vectors():
operation_info = client.upsert(
collection_name="test_collection",
wait=True,
points=[
PointStruct(id=1, vector=[0.05, 0.61, 0.76, 0.74], payload={"city": "Berlin"}),
PointStruct(id=2, vector=[0.19, 0.81, 0.75, 0.11], payload={"city": "London"}),
PointStruct(id=3, vector=[0.36, 0.55, 0.47, 0.94], payload={"city": "Moscow"}),
PointStruct(id=4, vector=[0.18, 0.01, 0.85, 0.80], payload={"city": "New York"}),
PointStruct(id=5, vector=[0.24, 0.18, 0.22, 0.44], payload={"city": "Beijing"}),
PointStruct(id=6, vector=[0.35, 0.08, 0.11, 0.44], payload={"city": "Mumbai"}),
],
)
print(operation_info)
2.5 简单查询
根据向量查询最相似的前n条向量数据。
def query():
search_result = client.search(
collection_name="test_collection", query_vector=[0.2, 0.1, 0.9, 0.7], limit=3, with_vectors=True
)
print(search_result)
查询结果如下:
[ScoredPoint(id=4, version=0, score=1.362, payload={'city': 'New York'}, vector=[0.18, 0.01, 0.85, 0.8], shard_key=None, order_value=None), ScoredPoint(id=1, version=0, score=1.2730000000000001, payload={'city': 'Berlin'}, vector=[0.05, 0.61, 0.76, 0.74], shard_key=None, order_value=None), ScoredPoint(id=3, version=0, score=1.208, payload={'city': 'Moscow'}, vector=[0.36, 0.55, 0.47, 0.94], shard_key=None, order_value=None)]
2.6 filter查询
根据向量+负载过滤查询最相似的前n条向量数据。
(1) MatchValue 精确查询
from qdrant_client.models import Filter, FieldCondition, MatchValue
def query_with_filter():
search_result = client.search(
collection_name="test_collection",
query_vector=[0.2, 0.1, 0.9, 0.7],
query_filter=Filter(
must=[FieldCondition(key="city", match=MatchValue(value="Beijing"))]
),
with_vectors=True,
limit=3,
)
print(search_result)
查询结果如下:
[ScoredPoint(id=5, version=0, score=0.5720000000000001, payload={'city': 'Beijing'}, vector=[0.24, 0.18, 0.22, 0.44], shard_key=None, order_value=None)]
(2)MatchText 模糊查询
def query_with_filter_fuzzy():
search_result = client.search(
collection_name="test_collection",
query_vector=[0.2, 0.1, 0.9, 0.7],
query_filter=Filter(
must=[FieldCondition(key="city", match=MatchText(text="jin"))]
),
with_vectors=True,
limit=3,
)
print(search_result)
查询结果如下:
[ScoredPoint(id=5, version=0, score=0.5720000000000001, payload={'city': 'Beijing'}, vector=[0.24, 0.18, 0.22, 0.44], shard_key=None, order_value=None)]