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

GraphQL 与 Elasticsearch 相遇:使用 Hasura DDN 构建可扩展、支持 AI 的应用程序

作者:来自 Elastic Praveen Durairaju

GraphQL 提供了一种高效且灵活的数据查询方式。本博客将解释 Hasura DDN 如何与 Elasticsearch 配合使用,以实现高性能和元数据驱动的数据访问。

此示例的代码和设置可在此 GitHub 存储库 - elasticsearch-subgraph-example 中找到。

Hasura DDN 是一个为云构建的元数据驱动的数据访问层。它会自动生成支持事务和分析工作负载的 API。通过利用元数据(例如模型、关系、权限和安全规则),Hasura 创建了针对性能进行了优化的 API,提供低延迟响应并轻松处理高并发需求。

元数据驱动(Metadata-driven) API 在搜索 AI 世界中的作用

元数据驱动 API 使用声明式方法,而不是手动编码每个端点及其相关逻辑。数据源(如 Elasticsearch 索引)的结构以标准化格式描述。定义不同实体之间的关系。权限和安全规则以细粒度级别指定,全部使用配置。

基于此元数据,API 层会自动配置并与数据源保持同步。

对于 Elasticsearch,使用 Hasura DDN 的元数据驱动 API 可提供统一且一致的数据访问。数据的变化会立即反映在 API 中,这对于实时搜索和 AI 应用程序至关重要。

架构

在上面的架构中,Hasura 是连接多个子图的超级图,Elasticsearch 是子图中的数据源之一。

为 Elasticsearch 设置 GraphQL API

此设置将引导你使用 Docker 将 Hasura DDN 连接到本地运行的 Elasticsearch 实例。但是,你可以通过使用正确的凭证更新环境变量轻松切换到 Elastic Cloud。使用 Elastic Cloud 是在生产环境中体验 Elasticsearch 的推荐方式,它提供可管理、可扩展且安全的部署。

设置:加载示例数据集

git clone https://github.com/hasura/elasticsearch-subgraph-example

将 .env.example 复制到 .env 并设置 ELASTICSEARCH_PASSWORD 的值。

使用示例索引在本地启动 elasticsearch:

docker compose up -d

访问 http://localhost:9200 以验证 Elasticsearch 是否正在使用示例数据运行。

Elasticsearch 的 GraphQL 子图

在本节中,我们将设置一个 GraphQL 子图(subgraph),将 Hasura DDN 连接到你的 Elasticsearch 实例。子图允许你将 Elasticsearch 公开为可查询的 API,从而提供一种灵活而高效的方式通过 GraphQL 执行复杂的搜索、聚合和过滤。

先决条件

  • Hasura CLI [从此处安装]
  • 使用 ddn auth login 登录并进行身份验证

初始化超级图:

ddn supergraph init .

初始化 Elasticsearch 连接器:

ddn connector init -i

在快速启动向导中,输入以下环境变量值:

ELASTICSEARCH_URL=http://local.hasura.dev:9200
ELASTICSEARCH_USERNAME=elastic
ELASTICSEARCH_PASSWORD=elasticpwd

要使用 Elastic Cloud 而不是本地实例,只需修改 .env 文件中的环境变量。将 ELASTICSEARCH_URL、ELASTICSEARCH_USERNAME 和 ELASTICSEARCH_PASSWORD 值替换为 Elastic Cloud 部署中的相应凭据。

Hasura DDN 连接到 Elasticsearch 以进行自检和生成 GraphQL API。

自检 Elasticsearch 实例并跟踪所有索引和集合:

ddn connector introspect elasticsearch --add-all-resources

本地启动 Supergraph:

ddn run docker-start

在本地构建 Supergraph:

ddn supergraph build local

访问 https://console.hasura.io/local/graphql?url=http://localhost:3000 开始探索本地 supergraph。

用于搜索的 GraphQL 查询

现在我们已经设置了 Hasura DDN 并将元数据驱动的 API 应用于 Elasticsearch,让我们来编写 GraphQL 查询来执行搜索操作。

以下查询重点介绍了 Hasura 如何将复杂的搜索和聚合要求转化为简单的声明式 GraphQL 操作。这些示例不仅展示了 GraphQL 的灵活性,还展示了 Hasura 带来的标准化,从而实现了跨不同数据源的一致 API 访问。

获取 5 个产品(简单查询)

query searchProducts {products(limit: 5) {idpricenameproductId}
}

获取 5 个产品名称与术语 “shoes”匹配的产品(使用词组匹配的搜索查询)

query searchProducts {products(limit: 5, where: {name: {match_phrase: "shoes"}}) {idpricenameproductId}
}

获取符合过滤条件的产品集合(聚合查询)

query aggregateOfProducts {productsAggregate(filter_input: {where: {name: {match_phrase: "shoes"}}}) {name {_count}}
}

注意:此集成不仅限于搜索 API,还可以扩展到 Elasticsearch 中的日志记录和可观察性数据用例。

Hasura 对可组合性和标准 API 的支持使得将多个数据源(Postgres、MongoDB、REST 等)与 Elasticsearch 连接起来成为可能,从而构建一个更大的 Supergraph 来满足跨团队的需求。这种可组合性允许不同的团队以一致、标准化的方式访问相同的 API 端点和数据源,从而减少技术债务。

无论你是构建搜索体验还是高级分析仪表板,Hasura 都能让你的团队专注于应用程序逻辑而不是 API 管理,从而提高上市速度并降低运营复杂性。

大规模性能考虑

将 Hasura 和 Elasticsearch 结合使用的主要优势之一是通过谓词下推(predicate pushdown)来优化性能。Hasura DDN 能智能地编译并将过滤、限制和排序操作直接推送到 Elasticsearch,减少 N+1 查询的开销,避免数据过度抓取。

例如,以下 GraphQL 查询:

query searchProducts {products(limit: 5, where: { name: { match_phrase: "shoes" } }) {idpricenameproductId}
}

生成类似于以下内容的 Elasticsearch 查询:

{"_source": ["_id","price","name","product_id"],"query": {"match_phrase": {"name": "shoes"}},"size": 5
}

通过仅请求必要的字段 (_source) 并限制获取的文档数量 (size),Hasura 可确保 Elasticsearch 达到最佳性能。与传统的手动编码 API 相比,这是一个显著的改进,因为在传统的 API 中,每个新需求都需要额外的手写查询。

总结

正如本文所探讨的那样,用于 Elasticsearch 的 Hasura DDN 连接器为加速 Elasticsearch 的 GraphQL API 和在组织中构建更大的 Supergraph 开辟了新的可能性,并与多个团队合作。

Hasura 的元数据驱动方法简化了 API 开发,为通过 GraphQL 访问 Elasticsearch 数据提供了一个快速、一致且安全的层。通过利用谓词下推,Hasura 可确保最佳搜索性能。详细了解 Hasura 针对 Elasticsearch 的功能。

我们很高兴看到你将构建什么!

准备好自己尝试一下了吗?开始免费试用。

想要获得 Elastic 认证?了解下一期 Elasticsearch 工程师培训何时开始!

原文:https://www.elastic.co/search-labs/blog/builing-ai-ready-apps-with-hasura-dnn-elasticsearch

相关文章:

GraphQL 与 Elasticsearch 相遇:使用 Hasura DDN 构建可扩展、支持 AI 的应用程序

作者:来自 Elastic Praveen Durairaju GraphQL 提供了一种高效且灵活的数据查询方式。本博客将解释 Hasura DDN 如何与 Elasticsearch 配合使用,以实现高性能和元数据驱动的数据访问。 此示例的代码和设置可在此 GitHub 存储库 - elasticsearch-subgraph…...

面试题整理 3

总结了某公司面试遇到的值得整理记录的面试题,比较侧重于Redis方面。 目录 Redis持久化配置 RDB AOF Redis rdb日志文件路径编辑 命令行参数设置 Redis事务 Redis事务介绍 Redis事务阶段 watch监听 Mysql隔离级别 1.READ UNCOMMITTED 2.READ COMMITTED …...

数据结构(Java)—— 认识泛型

1. 包装类 在学习泛型前我们需要先了解一下包装类 在 Java 中,由于基本类型不是继承自 Object ,为了在泛型代码中可以支持基本类型, Java 给每个基本类型都对应了一个包装类型。 1.1 基本数据类型和对应的包装类 基本数据类型包装类byteByt…...

处理后的视频如何加上音频信息?

总方案:原来模型对图像进行每帧处理,保留后的视频自然失去了audio信息,因此先用ffmpeg处理得到audio,原输出video加上audio即可,也采用ffmpeg处理。 imageio库用于读取和写入视频文件,并且你正在使用img_cartoon模型处理每一帧图像。然而,这段代码只处理了视频的图像部…...

02LangChain 实战课——安装入门

LangChain安装入门 一、大语言模型简介 大语言模型是利用深度学习技术,尤其是神经网络,来理解和生成人类语言的人工智能模型。这些模型因其庞大的参数数量而得名,能够理解和生成复杂的语言模式。它们通过预测下一个词来训练,基于…...

Python函数中关键字参数、位置参数、默认参数有何不同

在Python中,函数的参数分为三种类型:关键字参数(key arguments)、位置参数(positional arguments)和默认参数(default arguments)。它们的主要区别在于调用时如何传递值,…...

PNG 格式和 JPG 格式都什么时候用

通常我们都知道,如果是针对网络传输或者网站的格式,我们多会使用 PNG 格式。 如果是照片,大部分都是 JPG 格式的。 那么我们网站常用的截图应该保存为什么格式呢? 照片截图 照片截图应该保存为 JPG 格式。 虽然现在我们多存储…...

Qt 练习做一个登录界面

练习做一个登录界面 效果 UI图 UI代码 <?xml version"1.0" encoding"UTF-8"?> <ui version"4.0"><class>Dialog</class><widget class"QDialog" name"Dialog"><property name"ge…...

计算机视觉实验一:图像基础处理

1. 图像的直方图均衡 1.1 实验目的与要求 (1)理解直方图均衡的原理与作用; (2)掌握统计图像直方图的方法; (3)掌握图像直方图均衡的方法。 1.2 实验原理及知识点 直方图均衡化是通过灰度变换将一幅图象转换为另一幅均衡直方图&#xff0c;即在每个灰度级上都具有相同的象素…...

【WebApi】C# webapi 后端接收部分属性

在C#的Web API后端接收部分属性,可以使用[FromBody]特性配合JsonPatchDocument或者Delta来实现。这里提供一个使用JsonPatchDocument的示例。 首先,定义一个模型类:public class User public class User {public int Id {get; set; }...

Java 使用 Redis

Java 使用 Redis 1. 引言 Redis是一个开源的、基于内存的数据结构存储系统,可以用作数据库、缓存和消息中间件。它支持多种类型的数据结构,如字符串、哈希、列表、集合、有序集合等。由于Redis基于内存,其读写速度非常快,因此被广泛应用于需要高速缓存和实时通讯的场景。…...

【ONE·Linux || 高级IO(二)】

总言 主要内容&#xff1a;多路转接&#xff1a;epoll学习。       文章目录 总言5、多路转接&#xff1a;epoll5.1、相关概念与接口5.1.1、基本函数认识5.1.1.1、epoll_create5.1.1.2、epoll_ctl5.1.1.3、epoll_wait 5.1.2、epoll的工作原理5.1.2.1、准备工作&#xff08;…...

将 IBM WatsonX 数据与 Milvus 结合使用,构建用于知识检索的智能 Slack 机器人

在当今快节奏的工作环境中&#xff0c;快速轻松地访问信息对于保持生产力和效率至关重要。无论是在 Runbook 中查找特定说明&#xff0c;还是访问关键知识转移 &#xff08;KT&#xff09; 文档&#xff0c;快速检索相关信息的能力都可以产生重大影响。 本教程将指导您构建一个…...

2024 网鼎杯 CTF --- Crypto wp

文章目录 青龙组Crypto1Crypto2 白虎组Crypto1Crypto2 朱雀组Crypto2Crypto3part1part2part3part4 青龙组 Crypto1 题目&#xff1a; from Crypto.Util.number import * from secret import flagp getPrime(512) q getPrime(512) n p * q d getPrime(299) e inverse(d,…...

深度学习基础知识-损失函数

目录 1. 均方误差&#xff08;Mean Squared Error, MSE&#xff09; 2. 平均绝对误差&#xff08;Mean Absolute Error, MAE&#xff09; 3. Huber 损失 4. 交叉熵损失&#xff08;Cross-Entropy Loss&#xff09; 5. KL 散度&#xff08;Kullback-Leibler Divergence&…...

《逆向记录》

这里写自定义目录标题 1.什么是vmp加密VMP加密的工作原理VMP加密的应用场景和优缺点实际应用案例 2.什么是ast混淆3.魔改算法总结 1.什么是vmp加密 ‌VMP加密&#xff08;Virtual Machine Protection&#xff09;‌是一种软件保护技术&#xff0c;旨在通过虚拟化和加密技术来保…...

chatgpt3.5权重参数有多少MB;llama7B权重参数有多少MB

目录 chatgpt3.5权重参数有多少MB llama7B权重参数有多少MB chatgpt3.5权重参数有多少MB 关于ChatGPT 3.5的权重参数占用的存储空间大小,虽然直接给出具体的MB数值可能较为困难(因为这取决于多种因素,如参数表示的精度、是否进行了压缩等),但可以根据其参数量来估算一个…...

ST IoT Wireless 物联网与无线技术 研讨会

一、研讨会背景与目的 ◆ 意法半导体致力于提供可靠且经济实惠的无线连接解决方案,包含Wireless NFC Security & Esim等产品。 ◆ 将智能物体连接到互联网和云&#xff0c;或者从更广泛的意义上说&#xff0c;连接到物联网&#xff08;IoT&#xff09;。 ◆ 远程监控、配…...

PHP实现雪花算法生成唯一ID

引言 雪花算法是Twitter开源的分布式ID生成算法&#xff0c;可以产生64位的ID。其中第一位是固定的正数标识&#xff0c;41位用于存储时间戳&#xff0c;剩下的为机器ID和序列号。通过时间戳、机器ID和序列号的组合&#xff0c;确保每个ID都是唯一的。 PHP代码 1、定义雪花算…...

APP的设置页面,应该怎样尽可能减少用户的输入操作呢

一、引言 在当今数字化时代&#xff0c;移动应用程序&#xff08;APP&#xff09;已经成为人们生活中不可或缺的一部分。无论是社交娱乐、工作学习还是日常生活&#xff0c;我们都离不开各种 APP 的帮助。而 APP 的设置页面作为用户调整应用参数、个性化定制功能的重要入口&am…...

基于uniapp+WebSocket实现聊天对话、消息监听、消息推送、聊天室等功能,多端兼容

基于 ​UniApp + WebSocket​实现多端兼容的实时通讯系统,涵盖WebSocket连接建立、消息收发机制、多端兼容性配置、消息实时监听等功能,适配​微信小程序、H5、Android、iOS等终端 目录 技术选型分析WebSocket协议优势UniApp跨平台特性WebSocket 基础实现连接管理消息收发连接…...

基于服务器使用 apt 安装、配置 Nginx

&#x1f9fe; 一、查看可安装的 Nginx 版本 首先&#xff0c;你可以运行以下命令查看可用版本&#xff1a; apt-cache madison nginx-core输出示例&#xff1a; nginx-core | 1.18.0-6ubuntu14.6 | http://archive.ubuntu.com/ubuntu focal-updates/main amd64 Packages ng…...

spring:实例工厂方法获取bean

spring处理使用静态工厂方法获取bean实例&#xff0c;也可以通过实例工厂方法获取bean实例。 实例工厂方法步骤如下&#xff1a; 定义实例工厂类&#xff08;Java代码&#xff09;&#xff0c;定义实例工厂&#xff08;xml&#xff09;&#xff0c;定义调用实例工厂&#xff…...

Spring Boot面试题精选汇总

&#x1f91f;致敬读者 &#x1f7e9;感谢阅读&#x1f7e6;笑口常开&#x1f7ea;生日快乐⬛早点睡觉 &#x1f4d8;博主相关 &#x1f7e7;博主信息&#x1f7e8;博客首页&#x1f7eb;专栏推荐&#x1f7e5;活动信息 文章目录 Spring Boot面试题精选汇总⚙️ **一、核心概…...

【JavaSE】绘图与事件入门学习笔记

-Java绘图坐标体系 坐标体系-介绍 坐标原点位于左上角&#xff0c;以像素为单位。 在Java坐标系中,第一个是x坐标,表示当前位置为水平方向&#xff0c;距离坐标原点x个像素;第二个是y坐标&#xff0c;表示当前位置为垂直方向&#xff0c;距离坐标原点y个像素。 坐标体系-像素 …...

Unity | AmplifyShaderEditor插件基础(第七集:平面波动shader)

目录 一、&#x1f44b;&#x1f3fb;前言 二、&#x1f608;sinx波动的基本原理 三、&#x1f608;波动起来 1.sinx节点介绍 2.vertexPosition 3.集成Vector3 a.节点Append b.连起来 4.波动起来 a.波动的原理 b.时间节点 c.sinx的处理 四、&#x1f30a;波动优化…...

Redis的发布订阅模式与专业的 MQ(如 Kafka, RabbitMQ)相比,优缺点是什么?适用于哪些场景?

Redis 的发布订阅&#xff08;Pub/Sub&#xff09;模式与专业的 MQ&#xff08;Message Queue&#xff09;如 Kafka、RabbitMQ 进行比较&#xff0c;核心的权衡点在于&#xff1a;简单与速度 vs. 可靠与功能。 下面我们详细展开对比。 Redis Pub/Sub 的核心特点 它是一个发后…...

让回归模型不再被异常值“带跑偏“,MSE和Cauchy损失函数在噪声数据环境下的实战对比

在机器学习的回归分析中&#xff0c;损失函数的选择对模型性能具有决定性影响。均方误差&#xff08;MSE&#xff09;作为经典的损失函数&#xff0c;在处理干净数据时表现优异&#xff0c;但在面对包含异常值的噪声数据时&#xff0c;其对大误差的二次惩罚机制往往导致模型参数…...

Java求职者面试指南:Spring、Spring Boot、MyBatis框架与计算机基础问题解析

Java求职者面试指南&#xff1a;Spring、Spring Boot、MyBatis框架与计算机基础问题解析 一、第一轮提问&#xff08;基础概念问题&#xff09; 1. 请解释Spring框架的核心容器是什么&#xff1f;它在Spring中起到什么作用&#xff1f; Spring框架的核心容器是IoC容器&#…...

【无标题】路径问题的革命性重构:基于二维拓扑收缩色动力学模型的零点隧穿理论

路径问题的革命性重构&#xff1a;基于二维拓扑收缩色动力学模型的零点隧穿理论 一、传统路径模型的根本缺陷 在经典正方形路径问题中&#xff08;图1&#xff09;&#xff1a; mermaid graph LR A((A)) --- B((B)) B --- C((C)) C --- D((D)) D --- A A -.- C[无直接路径] B -…...