Hologres搜索(Search)SDK

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

前提条件

安装SDK

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

重要

本文示例使用的holo-search-sdk版本为0.3.0,若出现异常请检查您的SDK版本。

  • 首次安装

    pip install holo-search-sdk
  • 检查已安装版本

    # 检查当前版本
    pip show holo-search-sdk
    
    # 如版本低于 0.3.0,执行升级
    pip install --upgrade 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),
        publish_date TIMESTAMP
    );
"""
_ = client.execute(create_table_sql, fetch_result=False)
说明

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

打开表

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

导入文本/向量数据

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

设置索引

  • 设置向量索引

    table.set_vector_index(
        column="vector_column",
        distance_method="Cosine",
        base_quantization_type="rabitq",
        use_reorder=True,
        max_degree=64,
        ef_construction=400
    )
  • 设置全文索引

    # 创建全文索引
    table.create_text_index(
        index_name="ft_idx_content",
        column="content",
        tokenizer="jieba"
    )
    
    # 修改全文索引
    table.set_text_index(
        index_name="ft_idx_content",
        tokenizer="ik"
    )
    
    # 删除全文索引
    table.drop_text_index(index_name="ft_idx_content")

查询数据

向量检索查询
# 向量搜索
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()
全文检索查询
# 基本全文检索
results = table.search_text(
    column="content",
    expression="机器学习",
    return_all_columns=True
).fetchall()

# 返回BM25相似性分数的全文检索
results = table.search_text(
    column="content",
    expression="深度学习",
    return_score=True,
    return_score_name="relevance_score"
).select(["id", "vector_column", "content"]).fetchall()

# 使用不同的检索模式
    # 关键词模式(默认)
results = table.search_text(
    column="content",
    expression="python programming",
    mode="match",
    operator="AND"  # 要求同时包含所有关键词
).fetchall()

    # 短语模式
results = table.search_text(
    column="content",
    expression="machine learning",
    mode="phrase"  # 精确短语匹配
).fetchall()

    # 自然语言模式
results = table.search_text(
    column="content",
    expression="+python -java",  # 必须包含python,不能包含java
    mode="natural_language"
).fetchall()

    # 术语检索
results = table.search_text(
    column="content",
    expression="python",
    mode="term" # 对expression不做分词或其他处理,直接去索引中精确匹配
).fetchall()
混合检索
# 全文+标量检索
results = (
    table.search_text(
        column="content",
        expression="人工智能",
        return_score=True,
        return_score_name="score"
    )
    .where("publish_date > '2023-01-01'")
    .order_by("score", "desc")
    .limit(10)
    .fetchall()
)

# 向量+标量检索
results = (
    table.search_vector(
        vector=query_vector, 
        column="vector_column",
        output_name="similarity_score",
        distance_method="Cosine"
    )
    .where("publish_date > '2023-01-01'")
    .order_by("similarity_score", "desc")
    .limit(10)
    .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