当前位置: 首页 > news >正文

自建免费AI搜索技能:基于SearXNG与Firecrawl的Agent联网方案

1. 项目概述:一个免费、可自部署的Web搜索技能

最近在折腾AI Agent和智能助手,发现一个挺普遍的需求:让AI能联网搜索。市面上方案不少,但要么收费,要么限制多,要么就是得自己从零开始搭一套复杂的爬虫和解析系统,对个人开发者或小团队来说,门槛不低。直到我发现了这个叫roryyu/websearch-free-skill的项目,眼前一亮。这本质上是一个为AI Agent(特别是基于composio或类似框架的Agent)设计的、开箱即用的Web搜索技能(Skill)。

简单来说,它帮你封装好了从发起搜索请求,到获取搜索结果,再到解析网页内容这一整套流程。你不需要去研究各个搜索引擎的API(很多已经收费或限制严格),也不用头疼怎么从杂乱无章的HTML里提取出干净、结构化的文本。这个技能包直接提供了一个标准化的“搜索”动作,你的Agent调用它,它返回整理好的信息,Agent再基于这些信息进行思考或回答。最吸引人的是,它标榜“免费”和“可自部署”,这意味着你可以完全掌控数据流和成本,不用担心额度问题,也能根据自己需求进行定制。

这个项目非常适合那些正在构建个人AI助手、自动化研究工具、信息聚合Bot,或者任何需要让AI获取实时信息的开发者。如果你厌倦了为搜索API付费,或者担心现成服务的稳定性和隐私问题,那么自己部署一个这样的技能,会是一个既经济又安心的选择。接下来,我就结合自己的部署和调试经验,把这个项目的里里外外、关键细节和踩过的坑,给大家完整拆解一遍。

2. 核心架构与工作原理拆解

在动手部署之前,我们先得搞清楚websearch-free-skill到底是怎么工作的。它不是魔法,其核心是巧妙地组合了几项成熟的开源技术,并将它们封装成一个统一的接口。

2.1 技术栈构成与选型理由

这个项目主要依赖于以下几个核心组件:

  1. SearXNG: 这是整个技能的“搜索引擎心脏”。SearXNG是一个开源的元搜索引擎,它本身不爬取网页,而是将用户的查询同时发送给Google、Bing、DuckDuckGo、Wikipedia等数十个公开的搜索引擎,然后聚合、去重、排序返回结果。它的关键优势在于:

    • 隐私友好:默认不记录用户IP、搜索历史,也不使用追踪器。
    • 无商业广告:返回结果纯净。
    • 可自托管:这是实现“免费”和“可控”的基石。你部署自己的SearXNG实例,就拥有了一个私有的、无查询限制的搜索入口。
    • API支持:提供了简洁的JSON API,方便程序调用。
  2. Firecrawl: 这是技能的“内容抓取与解析器”。SearXNG返回的只是包含标题、链接和摘要的搜索结果列表。要获取链接指向的网页的详细内容,就需要爬取和解析。Firecrawl(或其开源版本)是一个专门为LLM应用设计的爬虫框架,它能:

    • 智能解析:不是简单地下载HTML,而是能识别并提取出文章的主体内容,过滤掉导航栏、广告、侧边栏等噪音。
    • 结构化输出:可以将网页内容转换成干净的Markdown或纯文本格式,非常适合后续交给AI模型处理。
    • 处理JavaScript:对于现代动态网页(如用React、Vue.js构建的),它能通过无头浏览器(如Playwright)渲染后抓取,确保拿到完整内容。
  3. Composio(或类似Agent框架)的Skill SDK: 这是技能的“标准化外壳”。websearch-free-skill项目是按照Composio这个AI Agent工具平台的规范编写的。Skill SDK定义了一个技能应该有哪些元数据(名称、描述)、需要哪些输入参数(比如搜索关键词、结果数量)、会输出什么格式的数据。这样,任何兼容Composio的Agent都能像调用本地函数一样,轻松地调用这个搜索技能,而不必关心背后的SearXNG和Firecrawl是如何协作的。

为什么是这样一个组合?这个选型非常务实。直接调用商业搜索引擎API(如Google Custom Search JSON API)有严格的每日免费限额,超出后费用不菲。而利用开源的SearXNG作为代理,本质上是利用了各大搜索引擎对普通浏览器访问的宽容策略,绕开了API限制,实现了“免费”。Firecrawl则解决了从“链接”到“可用内容”这个最棘手的环节。最后,通过Skill SDK封装,极大降低了集成复杂度,让开发者能聚焦在Agent的逻辑本身。

2.2 工作流程与数据流转

一次完整的搜索调用,其内部流程是这样的:

  1. 接收指令:你的AI Agent决定需要进行一次Web搜索,于是它按照Skill的规范,构造一个请求,包含query(搜索词)、num_results(需要几条结果)等参数,调用websearch-free-skill
  2. 发起搜索:Skill接收到请求后,首先向你自己部署的SearXNG实例的API端点发送搜索请求。
  3. 聚合结果:SearXNG实例将查询分发给其配置的后端搜索引擎(如Google, Bing),收集它们的返回结果,经过排序和去重后,将前N条结果的标题、链接、摘要封装成JSON,返回给Skill。
  4. 抓取内容:Skill拿到结果链接列表,并不是直接返回给Agent。为了提供更丰富的信息,它会选取前几条(例如前3条)最相关的链接,调用Firecrawl服务,去分别抓取这些链接对应网页的详细内容。
  5. 解析与格式化:Firecrawl访问目标网页,执行渲染(如果需要),然后运用其解析算法提取核心正文,并将其转换为干净的文本或Markdown。
  6. 整合返回:Skill将SearXNG返回的原始结果列表(包含所有结果的链接和摘要)和Firecrawl抓取到的详细内容(针对部分结果)整合在一起,结构化地返回给调用它的AI Agent。
  7. Agent处理:AI Agent收到这份结构化的搜索报告,里面既有概括性的结果列表,也有具体网页的深度内容,它便可以综合这些信息,生成更准确、更全面的回答。

注意:步骤4和5(即调用Firecrawl进行深度抓取)通常是可配置的。如果只是为了快速获取链接列表,或者目标网站反爬严重,可以关闭这个功能,只返回SearXNG的聚合结果,这样速度更快,但对Agent的信息支持会弱一些。

3. 从零开始部署:环境准备与配置详解

理解了原理,我们就可以动手搭建自己的“免费搜索技能”了。整个过程可以分为三个主要部分:部署SearXNG、部署Firecrawl、以及配置和运行websearch-free-skill本身。

3.1 部署私有SearXNG搜索引擎

SearXNG的部署方式很多,这里推荐使用Docker,最为简单快捷。

1. 安装Docker与Docker Compose确保你的服务器或本地开发机已经安装了Docker和Docker Compose。你可以通过运行docker --versiondocker-compose --version来检查。

2. 创建SearXNG配置目录

mkdir searxng && cd searxng

3. 获取官方Docker Compose配置SearXNG官方提供了示例的docker-compose.yaml文件。我们基于此进行修改。

# 下载官方示例文件 curl -o docker-compose.yaml https://raw.githubusercontent.com/searxng/searxng-docker/master/docker-compose.yaml # 下载环境变量示例文件 curl -o .env https://raw.githubusercontent.com/searxng/searxng-docker/master/.env

4. 关键配置修改编辑.env文件,有几个关键设置需要关注:

# 设置一个安全的密钥,用于会话加密等。可以用 openssl rand -hex 32 生成。 SEARXNG_SECRET_KEY=你的32位十六进制密钥 # 将SearXNG设置为公开可用(如果你希望从外网访问),或者仅限本地。 SEARXNG_BASE_URL=http://你的服务器IP:8080/ # 非常重要!启用JSON格式的搜索API,这是Skill调用的基础。 SEARXNG_SETTINGS='{ "search": { "formats": ["html", "json"] } }'

编辑docker-compose.yaml,确保端口映射正确(比如将容器内的8080端口映射到主机的8080端口)。

5. 启动SearXNG

docker-compose up -d

等待片刻,访问http://你的服务器IP:8080,你应该能看到SearXNG的搜索界面。尝试搜索一下,确认功能正常。

6. 获取API访问地址Skill调用的是SearXNG的JSON API端点。其地址格式为:http://你的服务器IP:8080/search?q=关键词&format=json。你可以直接在浏览器中测试这个链接,看看返回的JSON数据是否正常。

实操心得:在云服务器上部署时,务必在安全组或防火墙中开放你映射的端口(如8080)。另外,SearXNG的默认配置可能访问某些搜索引擎不稳定,你可以在其管理界面(/preferences)的“引擎”选项卡中,禁用一些不常用或经常超时的引擎,只保留Google、Bing、DuckDuckGo等核心引擎,能提升搜索速度和稳定性。

3.2 部署Firecrawl爬虫服务

Firecrawl提供了多种部署方式,包括云服务(付费)和自托管开源版本。websearch-free-skill通常对接其开源版本。

1. 克隆Firecrawl开源仓库

git clone https://github.com/mendableai/firecrawl cd firecrawl

2. 使用Docker Compose启动Firecrawl项目也提供了docker-compose.yml文件,使得部署非常方便。

# 直接使用docker-compose启动所有服务(包括API服务器、爬虫worker、Redis队列等) docker-compose up -d

这个过程会拉取多个镜像,包括Playwright(用于渲染JS网页),所以首次启动可能需要一些时间。

3. 验证Firecrawl服务默认情况下,Firecrawl的API服务器运行在3002端口。你可以通过一个简单的cURL命令测试它是否工作:

curl -X POST http://localhost:3002/v1/scrape \ -H "Content-Type: application/json" \ -d '{"urls": ["https://example.com"]}'

如果返回了包含网页内容和元数据的JSON,说明Firecrawl服务部署成功。

4. 关键配置说明Firecrawl的配置主要在docker-compose.yml和其环境变量中。对于基础使用,默认配置通常足够。但如果你需要处理大量请求或特定网站,可能需要调整:

  • WORKER_CONCURRENCY: 控制同时爬取的worker数量。
  • PLAYWRIGHT_HEADLESS: 是否以无头模式运行浏览器,一般设为true
  • 你可以在docker-compose.yml中映射自己的配置文件,来设置请求头、超时时间、代理等高级选项,以应对反爬策略。

注意事项:Firecrawl自托管版本需要处理网页渲染,对服务器CPU和内存有一定要求。对于简单的静态网页,负载很轻;但如果频繁抓取复杂的单页应用(SPA),资源消耗会显著上升。建议在配置不低于2核4G的服务器上运行。

3.3 配置与运行websearch-free-skill

前两步是搭建基础设施,现在我们来安装和配置技能本身。

1. 获取技能代码

git clone https://github.com/roryyu/websearch-free-skill.git cd websearch-free-skill

2. 安装Python依赖项目根目录下会有requirements.txt文件。

pip install -r requirements.txt

3. 配置环境变量这是连接技能与SearXNG、Firecrawl的关键。你需要创建一个.env文件,或者直接导出环境变量。

# 复制示例环境文件(如果项目提供) cp .env.example .env # 编辑 .env 文件,填入你的服务地址 SEARXNG_BASE_URL=http://你的服务器IP:8080 # 你的SearXNG实例地址 FIRECRAWL_API_URL=http://你的服务器IP:3002 # 你的Firecrawl API地址 # 如果Firecrawl需要API密钥(云服务版),在这里设置 # FIRECRAWL_API_KEY=your_firecrawl_api_key
  • SEARXNG_BASE_URL: 指向你刚刚部署的SearXNG实例。技能会向{SEARXNG_BASE_URL}/search?format=json发送请求。
  • FIRECRAWL_API_URL: 指向你部署的Firecrawl服务的API地址。技能会向{FIRECRAWL_API_URL}/v1/scrape发送抓取请求。

4. 理解技能代码结构通常,一个Composio Skill的核心是一个skill.py文件,里面定义了:

  • class WebSearchFreeSkill: 技能主类。
  • @action装饰器: 标记一个可被调用的动作,比如search
  • schema: 定义动作的输入参数(如query: str,num_results: int)和输出格式。 你需要检查代码,确认它如何读取环境变量、如何调用SearXNG和Firecrawl的API。

5. 本地测试技能在运行Agent之前,最好先单独测试一下技能是否正常工作。你可以写一个简单的Python脚本:

import asyncio import os from skill import WebSearchFreeSkill # 根据实际文件导入 async def test(): skill = WebSearchFreeSkill() # 调用技能的search动作 result = await skill.actions.search(query="什么是大型语言模型", num_results=3) print(result) if __name__ == "__main__": asyncio.run(test())

运行这个脚本,观察输出。它应该会打印出包含搜索结果和抓取内容的字典。如果报错,根据错误信息检查环境变量配置、网络连通性(技能能否访问到SearXNG和Firecrawl服务)以及依赖包版本。

4. 集成到AI Agent:以Composio为例

技能部署测试成功后,下一步就是把它“装配”到你的AI Agent上。这里以Composio框架为例,展示集成过程。

4.1 在Composio平台注册技能

Composio作为一个中心化的技能市场和管理平台,简化了集成。

  1. 创建Toolset: 登录Composio平台,创建一个新的Toolset(工具集),给它起个名字,比如my-websearch-tools
  2. 添加本地技能: 在Toolset中,选择添加技能。由于websearch-free-skill是一个本地/自定义技能,你需要通过“Custom Skill”或“Git Repo”的方式添加。
    • 方式一(推荐): 如果你的技能代码已经在GitHub等公开仓库,可以直接提供仓库URL。Composio可以拉取代码并识别其中的Skill定义。
    • 方式二: 如果代码在本地,你需要按照Composio的CLI工具指引,将技能打包并推送到平台。通常需要安装composio-cli,在技能目录下运行composio push等命令。
  3. 配置连接器: 添加技能后,你需要为这个技能配置一个“连接器”(Connector)。对于自托管的技能,连接器通常是一个运行在你本地的守护进程(composio-local),它负责在Composio云平台和你的本地技能服务之间建立安全隧道。你需要按照指引下载并运行这个本地连接器,并让它与你刚创建的Toolset关联。
  4. 获取API密钥: 集成完成后,Composio会为这个Toolset生成一个API密钥。你的Agent代码将使用这个密钥来调用Toolset里的所有技能。

4.2 在Agent代码中调用搜索技能

假设你使用OpenAI的Assistant API或LangChain来构建Agent,集成Composio技能非常直观。

示例(使用Composio Python SDK):

import os from composio import Composio from composio.openai import ComposioToolSet # 1. 初始化Composio客户端,使用你的API密钥 COMPOSIO_API_KEY = os.getenv("COMPOSIO_API_KEY") composio = Composio(api_key=COMPOSIO_API_KEY) # 2. 获取你创建的Toolset toolset = composio.get_toolset("my-websearch-tools") # 替换为你的Toolset名称 # 3. 将Toolset中的工具(即我们的websearch技能)注册到你的AI框架 # 这里以LangChain为例 from langchain.agents import initialize_agent, AgentType from langchain_openai import ChatOpenAI llm = ChatOpenAI(model="gpt-4", temperature=0) # 通过ComposioToolSet将工具转换为LangChain可用的格式 lc_tools = ComposioToolSet(toolset=toolset).get_langchain_tools() # 4. 创建并运行Agent agent = initialize_agent( tools=lc_tools, llm=llm, agent=AgentType.STRUCTURED_CHAT_ZERO_SHOT_REACT_DESCRIPTION, verbose=True ) # 5. 现在,Agent在思考过程中,如果需要搜索,就会自动调用我们的websearch技能了! response = agent.run("帮我搜索一下今天关于AI芯片的最新新闻,并总结要点。") print(response)

当Agent执行到需要信息的步骤时,它会自动触发websearch-free-skillsearch动作。Composio的本地连接器会收到请求,转发给你本地运行的技能服务,技能服务执行搜索和抓取,再将结果通过连接器返回给Composio平台,最终送达你的Agent。整个过程对开发者几乎是透明的,你只需要关注Agent的逻辑本身。

5. 高级配置、优化与故障排查

基础部署完成后,为了获得更稳定、更高效的搜索体验,还需要进行一些优化和问题处理。

5.1 性能与稳定性调优

  1. SearXNG优化

    • 引擎选择: 在SearXNG管理界面 (/preferences) 的“引擎”页,只启用google,bing,duckduckgo等少数稳定、快速的引擎。禁用不必要或响应慢的引擎,可以大幅减少搜索延迟和超时。
    • 超时设置: 在SearXNG的配置文件 (settings.yml) 中,可以调整server.limiter和引擎的timeout设置,避免因个别引擎无响应而拖慢整个搜索请求。
    • 使用缓存: 启用SearXNG的结果缓存,对于热门查询可以显著提速。
  2. Firecrawl优化

    • 并发控制: 在docker-compose.yml中调整WORKER_CONCURRENCY环境变量。不要设置过高,以免爬虫行为过于激进导致IP被目标网站封禁。通常2-4个并发worker对于个人使用足够了。
    • 请求速率限制: Firecrawl支持设置全局或针对特定域名的请求延迟 (delay)。在配置文件中添加适当的延迟(如1000毫秒),是遵守网站robots.txt、体现良好网络公民行为的关键,也能避免被封。
    • 超时与重试: 配置合理的请求超时时间和重试策略,以应对网络波动或网站暂时不可用的情况。
  3. 技能层优化

    • 异步处理: 确保websearch-free-skill的代码是异步的(使用async/await),这样在等待网络I/O(搜索、抓取)时不会阻塞。
    • 结果缓存: 可以考虑在技能层面为相同的搜索查询添加一个短期缓存(例如使用functools.lru_cache或Redis),在几分钟内重复的查询直接返回缓存结果,减少对后端服务的压力。
    • 限制抓取深度: 在技能代码中,严格控制调用Firecrawl抓取详细内容的页面数量。默认抓取前3条结果的内容通常是合理的平衡点。抓取全部结果会非常慢且消耗资源。

5.2 常见问题与解决方案实录

在实际部署和使用中,我遇到了不少问题,这里总结一下:

问题1:SearXNG搜索返回空结果或速度极慢。

  • 排查: 首先直接在浏览器访问你的SearXNG实例,进行相同关键词搜索,看网页版是否正常。如果不正常,问题在SearXNG本身。
  • 可能原因与解决
    • 网络问题: 你的服务器可能无法访问某些搜索引擎(如Google)。尝试在SearXNG后台切换使用不同的搜索引擎,或者检查服务器网络。
    • 引擎失效: 某些SearXNG内置的引擎可能已经失效。进入SearXNG的“引擎”设置,禁用所有引擎,然后只重新启用google,bing,duckduckgo等核心引擎进行测试。
    • 被屏蔽: 如果你的服务器IP发送的搜索请求过于频繁,可能被搜索引擎临时屏蔽。尝试为SearXNG配置代理(在settings.yml中设置outgoing.proxy)。

问题2:Firecrawl抓取失败,返回超时或空内容。

  • 排查: 直接用cURL调用Firecrawl API,尝试抓取一个简单网站(如https://example.com)和一个复杂网站(如一个新闻站)。
  • 可能原因与解决
    • Playwright问题: Firecrawl依赖Playwright来渲染JS。确保Docker镜像正确包含了Playwright和浏览器。可以进入Firecrawl的容器内,手动运行Playwright命令测试。
    • 网站反爬: 目标网站可能检测到无头浏览器或来自数据中心的流量。尝试在Firecrawl配置中设置更真实的User-Agent头,或者启用stealth模式(如果Firecrawl支持)。
    • 资源不足: 抓取复杂JS网页非常消耗内存和CPU。检查服务器资源使用情况,必要时升级配置或减少并发worker数。
    • 超时设置太短: 对于加载慢的页面,增加Firecrawl请求的超时时间。

问题3:技能运行时抛出依赖错误或模块找不到。

  • 排查: 仔细查看错误堆栈,确认是哪个Python包缺失或版本冲突。
  • 解决
    • 确保在正确的Python虚拟环境中安装依赖。
    • 检查requirements.txt中的包版本,有时需要根据你的Python版本进行微调。可以尝试先安装基础版本pip install composio-sdk requests aiohttp,再根据报错信息逐个解决。

问题4:Agent调用技能时超时或无响应。

  • 排查: 这是一个链条问题。需要分段排查。
    1. 测试技能本身: 用第3.3节的测试脚本直接运行,看是否正常。
    2. 测试Composio本地连接器: 检查连接器进程是否在运行,日志是否有报错。尝试通过Composio平台的测试功能手动触发一次技能调用。
    3. 检查网络: 确保运行Agent的机器能访问到SearXNG和Firecrawl的服务地址和端口。防火墙或安全组规则是常见阻碍。
  • 解决: 根据分段测试的结果,定位问题环节。最常见的是网络连通性问题或Composio连接器配置错误。

5.3 扩展可能性:超越基础搜索

websearch-free-skill提供了一个很好的起点,但你完全可以基于它进行扩展:

  1. 结果后处理: 在技能返回结果给Agent之前,可以添加一个后处理步骤。例如,使用一个轻量级的文本摘要模型(如BART)对Firecrawl抓取的长文进行摘要,只把核心摘要发给Agent,节省上下文窗口。
  2. 多模态搜索: 修改技能,使其不仅能搜索网页文本,还能通过SearXNG的“图像搜索”或“视频搜索”功能,获取图片或视频信息,并整合到返回结果中。
  3. 垂直领域增强: 如果你专注于某个领域(如学术、电商),可以配置SearXNG优先使用该领域的垂直搜索引擎(如Google Scholar),并在Firecrawl的解析规则中,针对该领域常见网站(如arXiv, Amazon)编写特定的内容提取规则,获得更精准的信息。
  4. 与知识库结合: 将搜索技能与本地知识库(如用ChromaDB、Pinecone存储的向量数据库)结合。Agent可以先在本地知识库中检索,如果找不到或信息过时,再触发Web搜索,并将搜索得到的新知识存入知识库,实现信息的持续更新和积累。

部署和调试这样一个系统确实需要一些耐心,尤其是当SearXNG或Firecrawl的某个环节出问题时。但一旦跑通,你就拥有了一个完全受控、免费、强大的AI信息获取渠道。这种将开源工具链组合起来解决实际问题的过程,本身也是极佳的学习和锻炼。

http://www.jsqmd.com/news/720654/

相关文章:

  • 基于Supabase与pgvector构建企业级RAG智能问答系统实战
  • 软件包的安装、卸载清除命令
  • 3分钟上手MegSpot:跨平台图片视频对比神器的终极指南
  • 【卷卷漫谈】GitHub统治世界,但我们开始怀念那个没有它的年代
  • OpenRGB技术解析:如何实现跨厂商RGB设备统一控制的架构设计
  • 如何用Translumo实现实时屏幕翻译:游戏、视频和软件的终极语言解决方案
  • 为什么 Rerank 是 RAG 从“玩具”走向“生产”的分水岭
  • 2026年3月知名的大吨位气动葫芦定制厂家推荐,气动单轨吊/5吨气动葫芦/10吨气动葫芦,大吨位气动葫芦定制厂家哪家权威 - 品牌推荐师
  • Realtek RTL8821CE无线网卡驱动:Linux系统下的完整安装与优化指南
  • 018、PCIE TLP头格式详解:从一次诡异的丢包说起
  • 3个关键设计突破:MyTV-Android如何重新定义电视直播体验
  • 超越传统SLAM:SLAM Toolbox如何实现终身建图与多机器人协同的突破
  • aWsm:用Rust实现WebAssembly系统接口,探索轻量级安全计算新范式
  • GRPO与GAD:深度学习模型蒸馏的优化策略与实践
  • 免费开源CAD软件LitCAD:快速入门二维绘图设计的完整指南
  • 2026年3月褶景机生产厂家推荐,服装压褶机/HE-217-T提花机/电脑打褶机/ZJ-416直刀机,褶景机公司有哪些 - 品牌推荐师
  • 漫画图像翻译解决方案:AI驱动的多语言漫画阅读体验
  • 从临床研究到风控模型:DeLong检验如何帮你科学评估模型性能?一个案例讲透
  • 混合式学习机器人进厂装电机,成功率99.4%
  • [具身智能-497]:如何在机器人上部署智能体?
  • Hunyuan Custom模型参数调优与风格迁移实战
  • 委托思维链架构:模块化LLM推理与执行解耦设计
  • 基于深度学习的道路坑洞识别 道路坑洞缺陷检测 YOLOv8图像分割实现路面坑洞检测+代码+教程+语意分割
  • 用Python和LTspice复现LM358共模电压测试,手把手教你验证运放极限
  • 让PS3手柄在Windows上重获新生的开源驱动解决方案
  • DeepSeek V4:AI从对话工具到智能系统的分水岭,OpenCSG已上线
  • Wan2.2-I2V-A14B参数调优指南:平衡生成质量、时长与显存占用的黄金组合
  • centos安装部署openclaw
  • 计算机大数据毕业设计Django+AI大模型股票行情预测系统 量化交易分析预测系统 大数据毕设(源码+LW+PPT+讲解)
  • 从零开始学Flink:Flink SL四大Join解析