多路搜索API允许在单次请求中并行发起最多N路独立的查询,并对各路召回的结果进行统一的排序和合并。可为每一路查询自定义召回数量、优先级,并对最终结果进行来源追溯,适用于需要融合文本、向量、不同索引或不同查询策略的复杂搜索场景。
核心概念
多路查询 (Multi-Path):在一次搜索请求中,并行执行多个独立的查询(每一路称为一个
path)。系统会对所有path返回的文档进行去重、合并和统一排序,最终返回一个结果列表。查询组 (Query Group):
priority(优先级)相同的path组成一个查询组。组内的path共享召回配额(quota)。例如,一个组内有 A 和 B 两路查询,quota均为 100。若 A 路实际只召回了 70 个文档,则剩余的 30 个quota可被 B 路使用,使 B 路最多可召回 130 个文档。衍生向量搜索 (Derived Vector Search):当某一路文本查询匹配到控制台配置的查询分析-文本向量化配置规则时,系统会自动衍生出新的一路向量查询。该衍生查询的
priority与其父文本路相同,quota默认为 0(即共享父文本路的quota)。
请求方法
POST
URL
/v3/openapi/apps/$app_name/multi-path-search$app_name:表示应用名(高级版/标准版是多应用版本类型,需要指定应用名访问,主要针对服务中的应用版本,如填写线下应用ID可访问线下应用搜索服务)
以上 URL 省略了请求Header参数及编码等因素。
以上 URL 中省略了访问应用的 host 地址。
请求参数
请求体是一个 JSON 对象,包含一个 queries 数组(定义了每一路查询)和其他全局请求参数。
全局请求参数
参数名 | 类型 | 是否必选 | 默认值 | 说明 |
raw_query | String | 否 | "" | 用户的原始查询词,用于查询分析或日志记录。 |
start | Integer | 否 | 0 | 分页起始位置,从第 |
hit | Integer | 否 | 10 | 本次请求返回的文档最大数量。取值范围: |
format | String | 否 |
| 返回结果的格式。 |
fetch_fields | String | 否 | 全部字段 | 指定需要返回的文档字段,多个字段用英文分号(;)分隔。 |
unified_rank_size | Integer | 否 | 2000 | 参与统一排序的文档总数。系统会从各路召回的结果中,按优先级挑选最多 |
unified_rank_type | String | 否 | none | 统一排序的类型。可选值: 统一排序的cava中无法进行文本相关性打分,可以使用ctr等模型进行打分。 |
unified_rank_name | String | 否 | "" | 排序脚本名称。当 |
vector_search | Object | 否 | {} | 向量召回配置,详细参数请参见向量召回。 |
user_id | String | 否 | "" | 终端用户的唯一标识,可用于uv统计或算法训练。 |
trace | String | 否 | "" | 搜索日志级别,用于问题排查。 |
rank_trace | String | 否 | "" | 排序日志级别,用于问题排查。 |
queries 数组成员对象参数
queries 数组中的每个 JSON 对象代表一路独立的查询。
参数名 | 类型 | 是否必选 | 默认值 | 说明 |
path | String | 是 | - | 当前查询路径的唯一标识。可以在排序日志中进行溯源。 |
query | String | 是 | - | 查询子句,定义了本路的召回条件。详细语法,请参见索引召回-query子句。 |
priority | Integer | 是 | - | 召回优先级。取值范围为非负整数, |
quota | Integer | 是 | - | 限制本路召回文档的最大数量。取值范围为非负整数。 |
qp | String | 否 | 控制台默认规则 | 查询分析配置的名称,多个配置用英文逗号(,)分隔。 |
first_rank_name | String | 否 | 控制台默认配置 | 基础排序配置的名称。 |
second_rank_name | String | 否 | 控制台默认配置 | 业务排序配置的名称。 |
total_rank_size | Integer | 否 | 引擎默认值 | 参与基础排序的文档总数。取值范围: |
total_rerank_size | Integer | 否 | 引擎默认值 | 参与业务排序的文档总数。取值范围: |
sort | String | 否 |
| 排序子句。详细语法,请参见 全局排序-sort子句。 |
filter | String | 否 | "" | 过滤子句。详细语法,请参见 结果过滤-filter子句。 |
kvpairs | Map | 否 | {} | 自定义键值对。详细用法,请参见 自定义传参-kvpairs子句。 |
代码示例
请求示例
以下示例演示了一个包含 3 路查询的请求:
main路径:最高优先级,使用sys_title查询分析规则。sub路径:次高优先级,不使用查询分析规则。main/vector路径:由于在main路径中的查询分析规则中进行了文本向量化操作,因此衍生出了一路向量搜索。
{
"queries": [
{
"query": "title:'AI'",
"path": "sub",
"priority": 2,
"quota": 100,
"qp": ""
},
{
"query": "title:'OpenSearch'",
"path": "main",
"priority": 1,
"quota": 100,
"qp": "sys_title"
}
],
"raw_query": "OpenSearch",
"start": 0,
"hit": 10,
"format": "fulljson",
"trace": "debug",
"rank_trace": "info",
"unified_rank_type": "rrf",
"unified_rank_size": 1000,
"fetch_fields": "title",
"user_id": "123",
"vector_search": {
"vector": {
"top_n": 100,
"namespaces": [],
"threshold": 0.5,
"search_params": {
"qc_scan_ratio": 0.01
}
}
}
}返回示例
{
"errors": [
{
"code": 2112,
"message": "Specified index not in query:text_relevance(title,default,true)"
}
],
"ops_request_misc": "%7B%22request%5Fid%22%3A%22176129335716862423300005%22%2C%22scm%22%3A%2220140713.120141928..%22%7D",
"request_id": "176129335716862423300005",
"result": {
"compute_cost": [
{
"index_name": "test",
"value": 13.73
}
],
"facet": [],
"items": [
{
"attribute": {
"pk": [
"120142134_1"
]
},
"fields": {
"title": "OpenSearch-行业算法版"
},
"property": {},
"sortExprValues": [
"0.0327869"
],
"tracerInfo": "begin search path[main] rank trace:\nend search path[main] rank trace.\n\nbegin search path[main/vector] rank trace:\nend search path[main/vector] rank trace.\n",
"variableValue": {}
},
{
"attribute": {
"pk": [
"120142134_2"
]
},
"fields": {
"title": "OpenSearch-召回引擎版"
},
"property": {},
"sortExprValues": [
"0.0322581"
],
"tracerInfo": "begin search path[main] rank trace:\nend search path[main] rank trace.\n\nbegin search path[main/vector] rank trace:\nend search path[main/vector] rank trace.\n",
"variableValue": {}
},
{
"attribute": {
"pk": [
"120142134_3"
]
},
"fields": {
"title": "AI搜索开放平台"
},
"property": {},
"sortExprValues": [
"0.0163934"
],
"tracerInfo": "begin search path[sub] rank trace:\nend search path[sub] rank trace.\n",
"variableValue": {}
}
],
"num": 3,
"searchtime": 0.085292,
"total": 3,
"viewtotal": 3
},
"status": "OK",
"tracer": ""
}返回参数
参数 | 类型 | 描述 |
status | string | 执行结果,OK为成功,FAIL为失败,请根据返回错误码进行排查 |
request_id | string | 该条查询的记录ID,主要用于排查问题使用 |
result | string | 实际返回结果,包括查询耗时searchtime、引擎总结果数total、本次请求返回结果数num、本次查询最大返回结果数viewtotal、查询结果items、统计结果 facet、scorllid 等信息 |
errors | string | 错误内容,error_message代表错误信息。error_code 对应含义参考 错误码文档 |
searchtime:指引擎耗时,单位为秒。
total、viewtotal、num区别:total为一次查询(不考虑config子句)引擎中符合条件的结果数(在结果数较多情况下,该值会做优化),但考虑到性能及相关性,引擎最多会返回viewtotal个结果。如果需要翻页的话,要求
start+hit必须要小于viewtotal,total一般用来做展示。num为本次查询请求(受限于config子句的start及hit)实际返回的条目,不会超过hit值。compute_cost:是一个只有一个map元素的数组,其中index_name表示应用ID,value表示本次查询消耗的LCU。
items:包含查询召回数据信息,其中fields为搜索召回内容。
variableValue:表示自定义参数返回结果,如获取distance距离值,variableValue 节点只有在config子句的format为
xml或者fulljson时才能展现出来,json格式默认不展示。sortExprValues: 表示对应文档排序分。
facet:用于存放Aggregate子句返回的信息。
array字段类型:通过JSON和fulljson格式返回,数据之间通过\t分割,如果通过xml格式返回,通过空格分割
多路查询处理流程
多路并行查询:并行处理请求中的每个query,根据每路query的quota,计算每路召回的个数(默认是quota个,最大不超过5000),将query发送给引擎,拿到每路的doc id候选集。
挑选候选集:按照priority依次从每路中挑选不超过quota个doc,如果挑选总量超过unified_rank_size则停止挑选。
候选集排序:
如果unified_rank_type=cava_script, 则将所有doc id发给引擎进行排序;
如果unified_rank_type=rrf,则直接通过rrf算法排序;
如果unified_rank_type=none,则跳过重排阶段。
返回结果:
如果进行了重排,根据start和hit,选择指定范围的doc作为结果集,如果没有进行重排,即unified_rank_type=none,则将整个候选集作为结果集(忽略start和hit参数);
重要当
unified_rank_type设置为none时,系统将跳过统一排序阶段,并忽略start和hit分页参数,直接返回构建的完整候选集。该模式可能导致返回大量数据,建议仅在需要在OpenSearch外部实现排序逻辑时使用。将结果集的doc id发送给引擎获取完整doc返回给用户。
限制说明
功能限制:不支持聚合(aggregation)、打散(distinct)和飘红(highlighting)功能。
路数限制:单次请求最多支持 5 路召回(衍生向量搜索不单独计入路数)。
应用类型限制:该功能仅限独享型应用。
召回数量限制:多路并行查询时,每路从引擎召回的候选集文档数量最大不超过 5000 个。