Hologres V4.0版本升级了向量检索能力,支持HGraph向量检索算法,实现高性能、高精度、低延时的向量检索能力。详情参见HGraph索引使用指南(推荐)。本文为您介绍如何使用Hologres的Python搜索SDK(holo-search-sdk)进行全文检索、向量检索。
前提条件
已创建AccessKey,详情请参见创建AccessKey。
已安装Python环境,且Python版本>=3.8。
授予账号相应权限,详情请参见授予RAM用户权限。
安装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获取实例的网络地址。 |
HOLO_PORT | Hologres的实例端口。 进入Hologres管理控制台的实时数仓Hologres获取实例端口。 |
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 foundA:Python运行环境需要安装pscopg-binary,执行如下命令:
pip install psycopg-binary
该文章对您有帮助吗?