向量检索SDK

Hologres V4.0版本升级了向量检索能力,支持HGraph向量检索算法,实现高性能、高精度、低延时的向量检索能力。详情参见HGraph索引使用指南(推荐)。本文为您介绍如何使用HologresPython SDK(Hologres Vector)进行向量计算。

前提条件

安装SDK

您可以通过pip安装Python SDK,更多说明请参见holo-search-sdk

pip install holo-search-sdk

使用步骤

连接Hologres

import holo_search_sdk as holo

# 连接到数据库
client = holo.connect(
    host="<HOLO_HOST>",
    port=<HOLO_PORT>,
    database="<HOLO_DBNAME>",
    access_key_id="<ACCESS_KEY_ID>",
    access_key_secret="<ACCESS_KEY_SECRET>",
    schema="public" #可根据实际schema修改
)

# 建立连接
client.connect()

变量说明:

变量

描述

HOLO_HOST

Hologres实例的网络地址。

进入Hologres管理控制台实时数仓Hologres实例列表 > 实例ID/名称 > 实例详情 > 网络信息获取实例的网络地址。

HOLO_PORT

Hologres的实例端口。

进入Hologres管理控制台实时数仓Hologres实例列表 > 实例ID/名称 > 实例详情 > 网络信息获取实例端口。

HOLO_DBNAME

Hologres创建的数据库名称。

ACCESS_KEY_ID

当前阿里云账号的AccessKey ID。

您可以点击AccessKey 管理,获取AccessKey ID。

ACCESS_KEY_SECRET

当前阿里云账号的AccessKey Secret。

创建向量

需要通过DDL创建,下面是创建的示例:

create_table_sql = """
    CREATE TABLE IF NOT EXISTS <TABLE_NAME> (
        id BIGINT PRIMARY KEY,
        content TEXT,
        vector_column FLOAT4[] CHECK (array_ndims(vector_column) = 1 AND array_length(vector_column, 1) = 3)
    );
"""
_ = client.execute(create_table_sql, fetch_result=False)
说明

<TABLE_NAME>需要替换成实际表名。

打开向量表

columns = {
    "id": ("INTEGER", "PRIMARY KEY"),
    "content": "TEXT",
    "vector_column": "FLOAT4[]"
}
table = client.open_table("<TABLE_NAME>")

导入向量数据

data = [
    [1, "Hello world", [0.1, 0.2, 0.3]],
    [2, "Python SDK", [0.4, 0.5, 0.6]],
    [3, "Vector search", [0.7, 0.8, 0.9]]
]
table.insert_multi(data, ["id", "content", "vector_column"])

设置向量索引

table.set_vector_index(
    column="vector_column",
    distance_method="Cosine",
    base_quantization_type="rabitq",
    max_degree=64,
    ef_construction=400
)

查询向量数据

  • 基础向量检索

    # 向量搜索
    query_vector = [0.2, 0.3, 0.4]
    
    # 限制结果数量
    results = table.search_vector(
        vector=query_vector, 
        column="vector_column",
        distance_method="Cosine"
    ).limit(10).fetchall()
    
    # 设置最小距离
    results = table.search_vector(
        vector=query_vector, 
        column="vector_column",
        distance_method="Cosine"
    ).min_distance(0.5).fetchall()
    
    # 带输出别名的搜索
    results = table.search_vector(
        vector=query_vector,
        column="vector_column",
        output_name="similarity_score",
        distance_method="Cosine"
    ).fetchall()
  • 基于主键的精确查询

    # 根据主键查询单条记录
    result = table.get_by_key(
        key_column="id",
        key_value=1,
        return_columns=["id", "content", "vector_column"]  # 可选,不指定则返回所有列
    ).fetchone()
    
    # 根据主键列表批量查询
    results = table.get_multi_by_keys(
        key_column="id", 
        key_values=[1, 2, 3],
        return_columns=["id", "content"]  # 可选,不指定则返回所有列
    ).fetchall()

关闭连接

# 关闭连接
client.disconnect()

常见问题

  • Q:导入holo_search_sdk报错如下:

    import holo_search_sdk as holo racevack (most recent call last):
    File "<stdin›"
    , line 1, in ‹module›
    File "/usr/local/lib/python3.8/site-packages/holo_search_sdk/__init__.py", line 9, in ‹module> from .client import Client, connect
    File "/usr/local/lib/python3.8/site-packages/holo_search_sdk/client.py", line 9, in <module> from psycopg. abc import Query
    File "/usr/local/lib/python3.8/site-packages/psycopg/__init__.py", line 9, in <module> from. import pa # noqa: F401 import early to stabilize side effects
    File "/usr/local/lib/python3.8/site-packages/psycopg/pq/__init__.py", line 116, in ‹module› import_from_libpqO)
    File"/usr/local/lib/python3.8/site-packages/psycopg/pq/__init__.py",line 108, in import_from_libpa raise ImportError(
    ImportError: no pa wrapper available.
    Attempts made:
    - couldn't import psycopg 'c' implementation: No module named 'psycopg_c'
    - couldn't import psycopg 'binary' implementation: No module named 'psycopg_binary'
    - couldn't import psycopg 'python' implementation: libpa library not found

    A:Python运行环境需要安装pscopg-binary,执行如下命令:

    pip install psycopg-binary