多路搜索

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

分页起始位置,从第 start 个文档开始返回。取值范围:[0, 5000]

hit

Integer

10

本次请求返回的文档最大数量。取值范围:[1, 500]

format

String

fulljson

返回结果的格式。

fetch_fields

String

全部字段

指定需要返回的文档字段,多个字段用英文分号(;)分隔。

unified_rank_size

Integer

2000

参与统一排序的文档总数。系统会从各路召回的结果中,按优先级挑选最多 unified_rank_size 个文档进行最终排序。取值范围:[1, 10000]

unified_rank_type

String

none

统一排序的类型。可选值:
• rrf:采用 Reciprocal Rank Fusion 算法对多路结果进行融合排序。
• cava_script:使用自定义的 Cava 脚本进行排序。

统一排序的cava中无法进行文本相关性打分,可以使用ctr等模型进行打分。
• none:跳过统一排序阶段。

unified_rank_name

String

""

排序脚本名称。当 unified_rank_type 为 cava_script 时必填。

vector_search

Object

{}

向量召回配置,详细参数请参见向量召回

user_id

String

""

终端用户的唯一标识,可用于uv统计或算法训练。

trace

String

""

搜索日志级别,用于问题排查。

rank_trace

String

""

排序日志级别,用于问题排查。

queries 数组成员对象参数

queries 数组中的每个 JSON 对象代表一路独立的查询。

参数名

类型

是否必选

默认值

说明

path

String

-

当前查询路径的唯一标识。可以在排序日志中进行溯源。

query

String

-

查询子句,定义了本路的召回条件。详细语法,请参见索引召回-query子句

priority

Integer

-

召回优先级。取值范围为非负整数,0 为最高优先级。系统优先从高优先级的 path 中挑选文档进入最终排序。

quota

Integer

-

限制本路召回文档的最大数量。取值范围为非负整数。

qp

String

控制台默认规则

查询分析配置的名称,多个配置用英文逗号(,)分隔。

first_rank_name

String

控制台默认配置

基础排序配置的名称。

second_rank_name

String

控制台默认配置

业务排序配置的名称。

total_rank_size

Integer

引擎默认值

参与基础排序的文档总数。取值范围:[1, 5000000]

total_rerank_size

Integer

引擎默认值

参与业务排序的文档总数。取值范围:[1, 10000]

sort

String

-RANK

排序子句。详细语法,请参见 全局排序-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子句的starthit)实际返回的条目,不会超过hit值。

  • compute_cost:是一个只有一个map元素的数组,其中index_name表示应用ID,value表示本次查询消耗的LCU。

  • items:包含查询召回数据信息,其中fields为搜索召回内容。

  • variableValue:表示自定义参数返回结果,如获取distance距离值,variableValue 节点只有在config子句formatxml或者fulljson时才能展现出来,json格式默认不展示。

  • sortExprValues: 表示对应文档排序分。

  • facet:用于存放Aggregate子句返回的信息。

  • array字段类型:通过JSONfulljson格式返回,数据之间通过\t分割,如果通过xml格式返回,通过空格分割

多路查询处理流程

  1. 多路并行查询:并行处理请求中的每个query,根据每路queryquota,计算每路召回的个数(默认是quota个,最大不超过5000),将query发送给引擎,拿到每路的doc id候选集。

  2. 挑选候选集:按照priority依次从每路中挑选不超过quotadoc,如果挑选总量超过unified_rank_size则停止挑选。

  3. 候选集排序:

    1. 如果unified_rank_type=cava_script, 则将所有doc id发给引擎进行排序;

    2. 如果unified_rank_type=rrf,则直接通过rrf算法排序;

    3. 如果unified_rank_type=none,则跳过重排阶段。

  4. 返回结果:

    1. 如果进行了重排,根据starthit,选择指定范围的doc作为结果集,如果没有进行重排,即unified_rank_type=none,则将整个候选集作为结果集(忽略starthit参数);

      重要

      当 unified_rank_type 设置为 none 时,系统将跳过统一排序阶段,并忽略 start 和 hit 分页参数,直接返回构建的完整候选集。该模式可能导致返回大量数据,建议仅在需要在OpenSearch外部实现排序逻辑时使用。

    2. 将结果集的doc id发送给引擎获取完整doc返回给用户。

限制说明

  • 功能限制:不支持聚合(aggregation)、打散(distinct)和飘红(highlighting)功能。

  • 路数限制:单次请求最多支持 5 路召回(衍生向量搜索不单独计入路数)。

  • 应用类型限制:该功能仅限独享型应用。

  • 召回数量限制:多路并行查询时,每路从引擎召回的候选集文档数量最大不超过 5000 个。