体验混合搜索
本教程将引导您快速上手 seekdb 混合搜索功能,展示混合搜索如何同时利用全文索引关键词和向量索引语义搜索的优势,帮助您更好地理解混合搜索的实际应用。
概述
混合搜索(Hybrid Search)结合了基于向量的语义搜索和基于全文索引的关键词搜索,通过综合排序提供更准确、全面的搜索结果。向量搜索擅长语义近似匹配,但对精确的关键字、数字和专有名词等匹配能力较弱,而全文搜索能有效弥补这一不足。seekdb 通过 DBMS_HYBRID_SEARCH 系统包提供混合搜索功能,支持以下场景:
- 纯向量搜索:根据语义相似性查找相关内容,适用于语义搜索、推荐系统等场景。
- 纯全文搜索:根据关键词匹配查找内容,适用于文档搜索、产品搜索等场景。
- 混合搜索:同时结合关键词匹配和语义理解,提供更精准、全面的搜索结果。
该特性广泛应用于智能搜索、文档搜索、产品推荐等场景。
前提条件
- 联系管理员获取相应的数据库连接串,然后执行以下命令连接到数据库:
- host: seekdb 数据库连接 IP。
- port: seekdb 数据库连接端口。
- database_name: 需要访问的数据库名称。
- user_name: 数据库用户名。
- password: 数据库密码。
mysql -h$host -P$port -u$user_name -p$password -D$database_name - 已创建测试表,并已在表中创建向量索引和全文索引:
CREATE TABLE doc_table(
c1 INT,
vector VECTOR(3),
query VARCHAR(255),
content VARCHAR(255),
VECTOR INDEX idx1(vector) WITH (distance=l2, type=hnsw, lib=vsag),
FULLTEXT INDEX idx2(query),
FULLTEXT INDEX idx3(content)
);
INSERT INTO doc_table VALUES
(1, '[1,2,3]', "hello world", "oceanbase Elasticsearch database"),
(2, '[1,2,1]', "hello world, what is your name", "oceanbase mysql database"),
(3, '[1,1,1]', "hello world, how are you", "oceanbase oracle database"),
(4, '[1,3,1]', "real world, where are you from", "postgres oracle database"),
(5, '[1,3,2]', "real world, how old are you", "redis oracle database"),
(6, '[2,1,1]', "hello world, where are you from", "starrocks oceanbase database");
步骤一:纯向量搜索
向量搜索通过计算向量相似度来查找语义相关的内容,适用于语义搜索、推荐系统等场景。
设置搜索参数,使用向量搜索查找与查询向量 [1,2,3] 最相似的记录:
SET @parm = '{
"knn" : {
"field": "vector",
"k": 3,
"query_vector": [1,2,3]
}
}';
SELECT JSON_PRETTY(DBMS_HYBRID_SEARCH.SEARCH('doc_table', @parm));
返回结果如下:
+----------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------+
| JSON_PRETTY(DBMS_HYBRID_SEARCH.SEARCH('doc_table', @parm)) |
+----------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------+
| [
{
"c1": 1,
"query": "hello world",
"_score": 1.0,
"vector": "[1,2,3]",
"content": "oceanbase Elasticsearch database"
},
{
"c1": 5,
"query": "real world, how old are you",
"_score": 0.41421356,
"vector": "[1,3,2]",
"content": "redis oracle database"
},
{
"c1": 2,
"query": "hello world, what is your name",
"_score": 0.33333333,
"vector": "[1,2,1]",
"content": "oceanbase mysql database"
}
] |
+----------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------+
1 row in set
返回结果按向量相似度排序,_score 表示相似度分数,分数越高表示越相似。