多路搜索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 个。