本文介绍UnifiedSearch(通晓统一搜索)的接口参数以及使用方法。
接口说明
UnifiedSearch IQS通晓搜索引擎是一个面向Agent的开放域搜索引擎,致力于在检索效果、成本、时延等维度提供更好的服务能力。 UnifiedSearch中不同的EngineType的差异比较:
比较项目 | Generic | GenericAdvanced | LiteAdvanced |
语义相关性 | 好 | 好 | 非常好 |
中长尾Query覆盖 | 非常好 | 非常好 | 好 |
索引更新时效性 | 非常好 | 非常好 | 好 |
站点权威性 | 好 | 非常好 | 好 |
搜索时延(平均RT) | 950ms | 950ms | 500ms |
多语言支持 | 中 | 中 | 好 |
成本 | 中 | 中 | 低 |
返回网页数量 | 约10条 | 40-80条 | 1-50条 |
高级检索 | 不支持 | 不支持 | 支持 |
接口定义
请求参数
参数 | 类型 | 必填 | 默认值 | 描述 | 示例值 | |
query | string | 是 | - | 搜索问题。取值范围:1~1024个字符。 | 苹果手机 | |
timeRange | string | 否 | NoLimit | 查询的时间范围。支持可选值:
| NoLimit | |
category | string | 否 | null | 查询分类,指定后只返回分类站点的搜索结果,多个行业使用逗号分隔(LiteAdvanced引擎不支持此参数)。支持可选值:
| ||
engineType | string | 否 | Generic | 搜索的引擎类型,不同引擎价格与结果会有差异。支持可选值:
| Generic | |
location | string | 否 | null | 位置信息,目前支持IP(LiteAdvanced引擎不支持此参数) 说明 目前对一些指定的场景效果比较明显,比如天气。会在sceneItems中返回对应地区的天气信息 | 117.136.XX.XX | |
contents | mainText | bool | 否 | false | 是否返回长正文。 | false |
markdownText | bool | 否 | false | 是否返回markdown格式正文。 | false | |
summary | bool | 否 | false | 是否返回增强摘要。收费选项; (LiteAdvanced 无需使用summary) | false | |
rerankScore | bool | 否 | true | 是否进行检索结果的Rerank,并返回rerankScore。 | true | |
advancedParams | map<string, string> | 否 | {} | 高级检索参数:(Generic、GenericAdvanced不支持此参数)
| | |
返回参数
字段 | 类型 | 是否可空 | 字段说明 | 样例 (Query: 上海车展最火爆的是哪个品牌) | ||
requestId | string | 不可空 | 请求RequestId, 排查问题时可以提供此信息 | 35E5608A-A737-2038-384D-D9D34C6BFD9E | ||
pageItems[] | title | string | 不可空 | 网站标题 | 上海车展大佬齐聚 问界成为话题中心 | |
link | string | 不可空 | 网站地址 | - | ||
snippet | string | 不可空 | 网页动态摘要,匹配到关键字的部分内容,平均长度150字符 说明 engineType=LiteAdvanced时,返回的长度约500字,信息更多,此时无需使用summary。 | - | ||
publishedTime | string | 可空 | 网页发布时间,ISO时间格式。 | 2025-04-27T20:36:04+08:00 | ||
mainText | string | 可空 | 解析得到的网页全正文,长度最大3000字符,召回比例超过98%; 说明 开启contents.mainText时返回 | - | ||
markdownText | string | 可空 | 解析得到的网页全文markdown格式,对表格等结构化信息有更好的支持,目前召回比例约50%,待持续提高。 说明 开启contents.markdownText时返回 | - | ||
images | string[] | 可空 | 网页中的图片地址。 | - | ||
hostname | string | 可空 | 网页的站点名称 | 中华网 | ||
hostLogo | string | 可空 | 网页的站点Logo | - | ||
summary | string | 可空 | 从网页全正文中提取出与查询(Query)最相关的信息,用于提供增强摘要,默认长度约500字 说明 开启contents.summary时返回 | - | ||
rerankScore | double | 可空 | 使用rerank模型对引擎召回结果进行重排序,相关性会有提升。 说明 开启contents.rerankScore时返回,并影响排序 | 0.7786493301391602 | ||
sceneItems[] | type | string | 可空 | 垂类场景结果类型(如天气、时间、日历等),后续会扩展更多类型,参考场景化调用SceneItem概览 重要 垂类场景结果有召回时,可以优先使用此结果,一般都会比网页召回更准确 | time | |
detail | string | 可空 | 垂类场景结果的详情,每种类型结构不同,故此结果是一个JSON结构的字符串。 | {\"title\": \"伦敦时间\", \"targetTimeZone\": \"Europe/London\", \"targetTimeMillisecond\": \"1745820817178\", \"targetTime\": \"2025-04-28 14:13:37\", \"beijingTimeZone\": \"PRC\", \"beijingTimeMillisecond\": \"1745846017178\"} | ||
searchInformation | searchTime | int64 | 不可空 | 搜索耗时 | 1048 | |
queryContext | engineType | string | 不可空 | 搜索的引擎类型 | Generic | |
originalQuery | query | string | 不可空 | 原始请求:query | 现在伦敦时间 | |
timeRange | string | 不可空 | 原始请求:timeRange | NoLimit | ||
rewrite | enabled | bool | 不可空 | 本次请求是否开启改写 | false | |
timeRange | string | 可空 | 改写后的timeRange,只有改写后的值与原始timeRange不一致时,才会返回。 | - | ||
costCredits | search | genericTextSearch | int32 | 不可空 | 基础文本搜索次数;计量计费信息请参考:产品计费 | 1 |
liteAdvancedTextSearch | int32 | 不可空 | 轻量版文本搜索次数;计量计费信息请参考:产品计费 | 0 | ||
valueAdded | summary | int32 | 不可空 | 增值包-增强摘要次数 | 1 | |
advanced | int32 | 不可空 | 增值包-增强版搜索次数 | 0 | ||
示例
请求参数(RequestBody)
{
"query": "2025跨年晚会周深齐豫欢颜",
"engineType": "LiteAdvanced",
"contents": {
"mainText": false,
"markdownText":false,
"summary": false,
"rerankScore": true
},
"advancedParams": {
"numResults": "2",
"startPublishedDate": "2024-12-01",
"endPublishedDate": "2025-01-31"
}
}返回参数
{
"requestId": "09277650-90de-468e-b299-09048b1c149d",
"pageItems": [
{
"title": "2025北京卫视跨年之夜(2024.12.31) 周深、齐豫合唱《欢颜》",
"link": "https://m.youku.com/video/id_XNjQ0ODQ5MTk3Mg==.html?source=",
"snippet": "2025北京卫视<em>跨年</em>之夜(2024.12.31)<em>周深</em>、<em>齐豫</em>合唱《<em>欢颜</em>》是在优酷播出的综艺高清视频,于2025-01-02 22:02:01上线。视频内容简介:2025北京卫视<em>跨年</em>之夜(2024.12.31)<em>周深</em>、<em>齐豫</em>合唱《<em>欢颜</em>》",
"publishedTime": "2024-12-31T00:00:00+08:00",
"mainText": null,
"markdownText": null,
"images": [
"https://m.ykimg.com/0542060167769AAC39525FBC7104B9EC"
],
"hostname": "优酷视频",
"hostLogo": "https://s2.zimgs.cn/ims?kt=url&at=smstruct&key=aHR0cHM6Ly9ndy5hbGljZG4uY29tL0wxLzcyMy8xNTYyODM2MzEzL2ZiL2VmLzkyL2ZiZWY5MmQwNDlhMGViMWZkMWM0MTI0ZjNjMmQzMDAwLmpwZw==&sign=yx:4iAKsNYcDPoZnsM8V51ZWwFQdW0=&tv=400_400",
"summary": null,
"rerankScore": 0.9996540546417236
},
{
"title": "#周深齐豫合唱欢颜#",
"link": "https://m.weibo.cn/status/P7rt709xu",
"snippet": "#周深齐豫合唱欢颜# 没有人能逃过周深《欢颜》的 “魔法”,尤其是跨年版本。他的歌声如同一幅绚丽的画卷,在跨年的时刻徐徐展开。每一年都盼着他的歌声跨年,这次与齐豫合唱,必将为画卷增添浓墨重彩的一笔。 k 收起 查看大图",
"publishedTime": "2024-12-31T20:18:00+08:00",
"mainText": null,
"markdownText": null,
"images": [],
"hostname": "微博",
"hostLogo": "https://s2.zimgs.cn/ims?kt=url&at=smstruct&key=aHR0cHM6Ly9ndy5hbGljZG4uY29tL0wxLzcyMy8xNTg0MzMwMjI4LzNkL2RhLzYwLzNkZGE2MDFlY2VlMmI2NGU3ZjAwNzdlMjYzZTA2YTI2Lmljbw==&sign=yx:ODPA0xcJzTX_28mEs3rV87Z1pvw=&tv=400_400",
"summary": null,
"rerankScore": 0.9994966983795166
}
],
"sceneItems": [],
"searchInformation": {
"searchTime": 774
},
"queryContext": {
"engineType": "LiteAdvanced",
"originalQuery": {
"query": "2025跨年晚会周深齐豫欢颜",
"timeRange": "NoLimit"
},
"rewrite": {
"enabled": false,
"timeRange": null
}
},
"costCredits": {
"search": {
"genericTextSearch": 0,
"liteAdvancedTextSearch": 1
},
"valueAdded": {
"summary": 0,
"advanced": 0
}
}
}错误码
Status | 错误码 | 错误信息 | 处理方案 |
404 | InvalidAccessKeyId.NotFound | Specified access key is not found. | 检查并确保AccessKey/Secret正确。 |
403 | Retrieval.NotActivate | Please activate AI search service | 请下单或联系您的客户经理进行开通。 |
403 | Retrieval.Arrears | Please recharge first. | 账户金额不足,请充值。 |
403 | Retrieval.NotAuthorised | Please authorize the AliyunIQSFullAccess privilege to the sub-account. | 子账号没有进行授权,参考创建RAM用户并授权。 |
403 | Retrieval.TestUserPeriodExpired | The test period has expired. | 测试已到期(自下单后15天有效),可以联系阿里云客户经理转正式。 |
429 | Retrieval.Throttling.User | Request was denied due to user flow control. | 超出限流规格,可联系阿里云客户经理进行升配。 |
429 | Retrieval.TestUserQueryPerDayExceeded | The query per day exceed the limit. | 测试超出日限额(1000次/天),可以联系阿里云客户经理转正式。 |
400 | Retrieval.InvalidPublishedDate | The specified parameter 'startPublishedDate' has an invalid date format. The correct format should be 'yyyy-MM-dd'. | 高级检索的发布开始时间格式错误。 |
接口调用
SDK调用
使用阿里云AK/SK认证方式,并使用阿里云SDK发起接口调用
Python SDK
前提条件
您需要确保已安装Python3.8或以上版本。
安装SDK
pip3 install alibabacloud_iqs20241111==1.4.1调用代码
同步调用
import os
from Tea.exceptions import TeaException
from alibabacloud_iqs20241111 import models
from alibabacloud_iqs20241111.client import Client
from alibabacloud_tea_openapi import models as open_api_models
class Sample:
def __init__(self):
pass
@staticmethod
def create_client() -> Client:
config = open_api_models.Config(
# TODO: 使用您的AK/SK进行替换(建议通过环境变量加载)
access_key_id='$YOUR_ACCESS_KEY',
access_key_secret='$YOUR_ACCESS_SECRET'
)
config.endpoint = f'iqs.cn-zhangjiakou.aliyuncs.com'
return Client(config)
@staticmethod
def main() -> None:
client = Sample.create_client()
run_instances_request = models.UnifiedSearchRequest(
body=models.UnifiedSearchInput(
query='杭州美食',
time_range='NoLimit',
engine_type='LiteAdvanced',
contents=models.RequestContents(
summary=False,
main_text=True,
),
advanced_params=dict(
numResults="2",
startPublishedDate="2025-01-01"
)
)
)
try:
response = client.unified_search(run_instances_request)
print(
f"api success, request_id:{response.body.request_id}, size :{len(response.body.page_items)}, server_cost:{response.body.search_information.search_time}")
if len(response.body.scene_items) > 0:
print(f"scene_items:{response.body.scene_items[0]}")
for index, item in enumerate(response.body.page_items):
print(f"{index}. {'-' * 20}")
print(f"title:{item.title}")
print(f"snippet:{item.snippet}")
print(f"summary:{item.summary}")
print(f"published_time:{item.published_time}")
print(f"link:{item.link}")
print(f"rerank_score:{item.rerank_score}")
except TeaException as e:
code = e.code
request_id = e.data.get("requestId")
message = e.data.get("message")
print(f"api exception, requestId:{request_id}, code:{code}, message:{message}")
if __name__ == '__main__':
Sample.main()
异步调用
import asyncio
import os
import time
from Tea.exceptions import TeaException
from alibabacloud_iqs20241111 import models
from alibabacloud_iqs20241111.client import Client
from alibabacloud_tea_openapi import models as open_api_models
class Sample:
def __init__(self):
pass
@staticmethod
def create_client() -> Client:
config = open_api_models.Config(
# TODO: 使用您的AK/SK进行替换(建议通过环境变量加载)
access_key_id=os.environ.get('ACCESS_KEY'),
access_key_secret=os.environ.get('ACCESS_SECRET')
)
config.endpoint = f'iqs.cn-zhangjiakou.aliyuncs.com'
return Client(config)
@staticmethod
async def main_async() -> None:
start = time.time()
client = Sample.create_client()
run_instances_request = models.UnifiedSearchRequest(
body=models.UnifiedSearchInput(
query='杭州美食',
time_range='NoLimit',
contents=models.RequestContents(
summary=False,
main_text=True,
)
)
)
try:
# 使用异步方法
response = await client.unified_search_async(run_instances_request)
print(
f"api success, request_id:{response.body.request_id}, size :{len(response.body.page_items)}, server_cost:{response.body.search_information.search_time}")
if len(response.body.scene_items) > 0:
print(f"scene_items:{response.body.scene_items[0]}")
for index, item in enumerate(response.body.page_items):
print(f"{index}. {'-' * 20}")
print(f"title:{item.title}")
print(f"snippet:{item.snippet}")
print(f"summary:{item.summary}")
print(f"published_time:{item.published_time}")
print(f"link:{item.link}")
print(f"rerank_score:{item.rerank_score}")
except TeaException as e:
code = e.code
request_id = e.data.get("requestId")
message = e.data.get("message")
print(f"api exception, requestId:{request_id}, code:{code}, message:{message}")
if __name__ == '__main__':
asyncio.run(Sample.main_async())Java SDK
前提条件
已安装Java8或以上版本。
Maven依赖
<dependency>
<groupId>com.aliyun</groupId>
<artifactId>iqs20241111</artifactId>
<version>1.4.1</version>
</dependency>调用代码
package com.aliyun.iqs.example;
import com.aliyun.iqs20241111.Client;
import com.aliyun.iqs20241111.models.*;
import com.aliyun.teaopenapi.models.Config;
import com.google.gson.Gson;
import com.google.gson.GsonBuilder;
public class UnifiedSearchExample {
public static void main(String[] args) throws Exception {
Client client = initClient();
invoke(client, "杭州美食", "NoLimit");
}
private static Client initClient() throws Exception {
// TODO: 使用您的AK/SK进行替换(建议通过环境变量加载)
String accessKeyId = "$YOUR_ACCESS_KEY";
String accessKeySecret = "$YOUR_ACCESS_SECRET";
Config config = new Config()
.setAccessKeyId(accessKeyId)
.setAccessKeySecret(accessKeySecret);
config.setEndpoint("iqs.cn-zhangjiakou.aliyuncs.com");
return new Client(config);
}
private static void invoke(Client client, String query, String timeRange) {
UnifiedSearchInput input = new UnifiedSearchInput();
input.setQuery(query);
input.setTimeRange(timeRange);
// 使用LiteAdvanced引擎,并使用高级检索参数
input.setEngineType("LiteAdvanced");
Map<String, String> advancedParams = new HashMap<>();
advancedParams.put("numResults", "5");
advancedParams.put("startPublishedDate", "2025-08-01");
advancedParams.put("excludeSites", "baidu.com,sina.cn");
input.setAdvancedParams(advancedParams);
RequestContents requestContents = new RequestContents().setSummary(false).setMainText(false);
input.setContents(requestContents);
UnifiedSearchRequest request = new UnifiedSearchRequest().setBody(input);
try {
UnifiedSearchResponse response = client.unifiedSearch(request);
UnifiedSearchOutput result = response.getBody();
printOutput(result);
} catch (Exception e) {
e.printStackTrace();
}
}
private static void printOutput(UnifiedSearchOutput output) {
// 使用 GsonBuilder 创建带格式化的 Gson 实例
Gson gson = new GsonBuilder()
.setPrettyPrinting()
.disableHtmlEscaping()
.create();
// 输出格式化的 JSON
String prettyJson = gson.toJson(output);
System.out.println(prettyJson);
}
}
Go SDK
前提条件
Go 环境版本必须不低于 1.10.x
安装SDK
require (
github.com/alibabacloud-go/iqs-20241111 v1.4.1
github.com/alibabacloud-go/darabonba-openapi/v2 v2.0.10
)
调用代码
package main
import (
"fmt"
openapi "github.com/alibabacloud-go/darabonba-openapi/v2/client"
iqs20241111 "github.com/alibabacloud-go/iqs-20241111/client"
util "github.com/alibabacloud-go/tea-utils/v2/service"
"github.com/alibabacloud-go/tea/tea"
"log"
)
const endpointURL = "iqs.cn-zhangjiakou.aliyuncs.com"
func createClient() (*iqs20241111.Client, error) {
// TODO: 使用您的AK/SK进行替换
accessKeyID := "YOUR_ACCESS_KEY"
accessKeySecret := "YOUR_ACCESS_SECRET"
if accessKeyID == "" || accessKeySecret == "" {
return nil, fmt.Errorf("ACCESS_KEY or ACCESS_SECRET environment variable is not set")
}
config := &openapi.Config{
AccessKeyId: tea.String(accessKeyID),
AccessKeySecret: tea.String(accessKeySecret),
Endpoint: tea.String(endpointURL),
}
return iqs20241111.NewClient(config)
}
func runGenericSearch(client *iqs20241111.Client) error {
body := &iqs20241111.UnifiedSearchInput{
Query: tea.String("杭州美食"),
TimeRange: tea.String("NoLimit"),
Contents: &iqs20241111.RequestContents{
Summary: tea.Bool(false),
MainText: tea.Bool(true),
},
}
request := &iqs20241111.UnifiedSearchRequest{
body,
}
runtime := &util.RuntimeOptions{}
resp, err := client.UnifiedSearchWithOptions(request, nil, runtime)
if err != nil {
return fmt.Errorf("generic search failed: %w", err)
}
fmt.Printf("[%s] response: %s\n", *resp.Body.RequestId, resp.Body)
return nil
}
func main() {
client, err := createClient()
if err != nil {
log.Fatalf("Failed to create client: %v", err)
}
if err := runGenericSearch(client); err != nil {
log.Fatalf("Error running generic search: %v", err)
}
}
HTTP调用
使用信息查询服务(IQS)产品的凭证(API-KEY)进行认证,并使用HTTP发起接口调用。创建并查看凭证,获取API-KEY。
Generic
curl -X POST https://cloud-iqs.aliyuncs.com/search/unified \
--header "Authorization: Bearer $API_KEY" \
--header "Content-Type: application/json" \
--data '{
"query": "杭州美食",
"engineType": "Generic",
"contents": {
"mainText": false,
"markdownText":false,
"summary": false,
"rerankScore": true
}
}'LiteAdvanced
curl -X POST https://cloud-iqs.aliyuncs.com/search/unified \
--header "Authorization: Bearer $API_KEY" \
--header "Content-Type: application/json" \
--data '{
"query": "杭州美食",
"engineType": "LiteAdvanced",
"contents": {
"mainText": false,
"markdownText":false,
"summary": false
},
"advancedParams":{
"numResults": "2",
"startPublishedDate": "2025-07-01",
"excludeSites":"aliyun.com,sina.cn"
}
}'$API_KEY 替换为信息查询服务控制台中创建的API-KEY,创建并查看凭证创建API-KEY需要等待5min生效。