混合搜索将文本(关键字)和矢量查询结合在单个搜索请求中。 这两个查询并行执行。 结果按新的搜索分数进行合并和重新排序,使用倒数排名融合 (RRF) 返回一个统一的结果集。
在本文中,您将学习如何:
- 设置基本混合请求
- 添加参数和筛选器
- 使用语义排名或矢量权重提高相关性
- 通过控制输入优化查询行为 (
maxTextRecallSize
)
先决条件
包含
searchable
矢量字段和非矢量字段的搜索索引。 我们建议使用导入和矢量化数据向导来快速创建索引。 其他内容请参阅创建索引和向搜索索引添加矢量字段。(可选)如果希望执行查询字符串的内置文本到矢量转换,可以创建矢量化器并将其分配给搜索索引中的矢量字段。
选择 API 或工具
Azure 门户中的搜索资源管理器(支持稳定版和预览版 API 搜索语法)有一个 JSON 视图,可让你将混合请求粘贴进去。
如果使用的是 maxTextRecallSize 和 countAndFacetMode(预览版)等预览功能,则使用稳定的 REST API 或最近的预览 API 版本。
为了方便阅读,我们使用 REST 示例来解释 API 的工作原理。 可以使用带 REST 扩展的 REST 客户端(例如 Visual Studio Code)来构建混合查询。 还可以使用 Azure SDK。 有关详细信息,请参阅 快速入门:矢量搜索。
设置混合查询
本部分介绍混合查询的基本结构,以及如何在搜索资源管理器中设置一个查询或在 REST 客户端中执行。
结果均以纯文本形式返回,包括标记为 retrievable
的字段中的矢量。 由于数值矢量在搜索结果中不起作用,因此请选择索引中的其他字段作为矢量匹配的代理。 例如,如果索引具有“descriptionVector”和“descriptionText”字段,则查询可以匹配“descriptionVector”,但搜索结果可以显示“descriptionText”。 使用 select
参数仅指定结果中可人工读取的字段。
登录到 Azure 门户 并查找搜索服务。
在 “搜索管理>索引”下,选择包含矢量和非矢量内容的索引。 搜索资源管理器 是第一个选项卡。
在 “视图”下切换到 JSON 视图 ,以便可以粘贴向量查询。
将默认查询模板替换为混合查询。 基本混合查询具有指定的
search
文本查询,以及指定的vectorQueries.vector
向量查询。 文本查询和矢量查询可以等价,也可以不等价,但通常具有相同的意向。此示例来自矢量快速入门,其中包含矢量和非矢量内容,以及多个查询示例。 为简洁起见,本文中截断了矢量。
{ "search": "historic hotel walk to restaurants and shopping", "vectorQueries": [ { "vector": [0.01944167, 0.0040178085, -0.007816401 ... <remaining values omitted> ], "k": 7, "fields": "DescriptionVector", "kind": "vector", "exhaustive": true } ] }
选择搜索。
提示
如果隐藏矢量,搜索结果将更易读。 在“查询选项”中,启用“在搜索结果中隐藏矢量值”。
下面是另一个版本的查询。 这一项包含一个
count
用于显示找到的匹配项数量,一个select
参数用于选择特定字段,以及一个top
参数用于返回前七个结果。{ "count": true, "search": "historic hotel walk to restaurants and shopping", "select": "HotelId, HotelName, Category, Tags, Description", "top": 7, "vectorQueries": [ { "vector": [0.01944167, 0.0040178085, -0.007816401 ... <remaining values omitted> ], "k": 7, "fields": "DescriptionVector", "kind": "vector", "exhaustive": true } ] }