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) {
    id
    price
    name
    productId
  }
}

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

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

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

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" } }) {
    id
    price
    name
    productId
  }
}

生成类似于以下内容的 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

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:/a/907228.html

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

filebeat+elasticsearch+kibana日志分析

1 默认配置 1.1 filebeat filebeat-7.17.yml,从网关中下载k8s的配置,指定es和kibana的配置 通过kibana查询可以查询到日志了,但此时还不知道具体怎么用。 1.2 kibana 在Discover中创建索引格式:filebeat-*,得到如下图&#xf…

Rust 力扣 - 2090. 半径为 k 的子数组平均值

文章目录 题目描述题解思路题解代码题目链接 题目描述 题解思路 半径为 k 的子数组平均值 等价于 子数组长度为2 * k 1的总和 除于 2 * k 1 我们遍历长度为2 * k 1的窗口,我们只需要记录窗口内的平均值即可 题解代码 impl Solution {pub fn get_averages(num…

uniapp的video视频属性打包app后层级过高

问题:在使用uniapp开发APP时,使用video标签显示视频发现H5可以正常展示,但是打包到APP后,它的层级过高,把底部导航都盖住了。 官网说明:uni-app官网 官网给了cover-view组件或plus.nativeObj.view、subNVue…

浅谈UI自动化

⭐️前言⭐️ 本篇文章围绕UI自动化来展开,主要内容包括什么是UI自动化,常用的UI自动化框架,UI自动化原理等。 🍉欢迎点赞 👍 收藏 ⭐留言评论 🍉博主将持续更新学习记录收获,友友们有任何问题…

Vue3+Data-V实现可视化大屏页面布局

目录 一、前言 二、环境准备 1.Vue3安装npm create vuelatest 2.Data-V配置 项目Data-v安装 main.js中注册Data-v到全局 ​编辑可使用按需引入 3.测试 三、导航栏路由跳转配置 1.子组件mainNav组件准备 2.父组件准备导航栏参数传递 3.子组件接收父组件参数 4.导航…

Python 使用 LSTM 进行情感分析:处理文本序列数据的指南

使用 LSTM 进行情感分析:处理文本序列数据的指南 长短期记忆网络(LSTM)是一种适合处理序列数据的深度学习模型,广泛应用于情感分析、语音识别、文本生成等领域。它通过在训练过程中“记住”过去的数据特征来理解和预测序列数据的…

树莓派5实时时钟(RTC)

树莓派5板载一个实时时钟模块。它可以通过 USB-C 电源插口右侧板上的 J5(BAT) 插口进行电池供电。如果没有互联网连接来通过 NTP 获取时间,RTC 可能会很有用。 可以设置唤醒警报,将树莓派5切换到非常低功耗的状态(大约3mA)。当到达…

保姆级教程!!教你通过【Pycharm远程】连接服务器运行项目代码

小罗碎碎念 这篇文章主要解决一个问题——我有服务器,但是不知道怎么拿来写代码,跑深度学习项目。确实,玩深度学习的成本比较高,无论是前期的学习成本,还是你需要具备的硬件成本,都是拦路虎。小罗没有办法…

Chrome与夸克的安全性对比

在当今数字化时代,浏览器的安全性对于用户来说至关重要。Chrome和夸克作为两款流行的浏览器,各有其特点和优势。本文将对这两款浏览器的安全性进行详细对比,帮助用户更好地了解它们之间的差异。(本文由https://www.chromegw.com/的…

ZFC in LEAN 之 前集(Pre-set)

前集(Pre-set)的概念是相对于集合(Set),由数学家 Bishop 提出的。Bishop 认为定义一个集合需要三个步骤: 1. 定义该集合的元素是如何构建的(Construction)。 2. 定义集合中的两元素的…

libaom 源码分析:AV1帧内预测 CfL 模式

CfL预测模式原理 从亮度到色度CfL 是一种色度帧内预测模式,通过建立共位重建亮度采样的线性函数来模拟色度采样;对于不同的色度采样格式(例如4:2:0和4:2:2),可能需要对重建的亮度像素进行子采样,以匹配色度…

C++核心编程和桌面应用开发 第十八天(一元/二元谓词 内建函数对象 算术/关系/逻辑仿函数 函数适配器/取反适配器/函数指针适配器/成员函数适配器)

目录 1.函数对象 1.1函数对象特点 2.谓词 2.1一元谓词 2.2二元谓词 3.内建函数对象 3.1算术仿函数 3.2关系仿函数 3.3逻辑仿函数 4.函数适配器 5.取反适配器 5.1一元取反适配器 5.2二元取反适配器 6.函数指针适配器 7.成员函数适配器 1.函数对象 概念&#xff…

Java后端面试内容总结

先讲项目背景,再讲技术栈模块划分, 讲业务的时候可以先讲一般再特殊 为什么用这个,好处是什么,应用场景 Debug发现问题/日志发现问题. QPS TPS 项目单元测试,代码的变更覆盖率达到80%,项目的复用性高…

P3-2.【结构化程序设计】第二节——知识要点:多分支选择语句

讲解视频: P3-2.【结构化程序设计】第二节——知识要点:多分支选择语句 知识要点:多分支选择语句 一、任务分析 已知某公司员工的保底薪水为500,某月销售商品的利润profit(整数)与利润提成的关系如下(单位:元)&#…

关于Android Studio Koala Feature Drop | 2024.1.2下载不了插件的解决办法

解决 androidStudio Settings->Plugins下载插件,点击install后没反应,同时插件描述相关显示不出来 第一步: 第二步: 点击设置,勾选Auto-detect proxy settings,输入网址 https://plugins.jetbrains.com…

UE中查“资源包因何变脏”的方式

“脏”(Dirty)的意思 当用户对一个资源包(关卡,或材质等美术资源)做出了修改,变得与磁盘上存储的内容有差异时,UE会对其“标脏”(Mark Dirty),显示为 * 符号…

leetcode 2710 移除字符串中的尾随零

1.题目要求: 2.题目代码: class Solution { public:string removeTrailingZeros(string num) {while(num[num.size() - 1] 0){num.pop_back();}return num;} };

Iceoryx2:高性能进程间通信框架(中间件)

文章目录 0. 引言1. 主要改进2. Iceoryx2 的架构3. C示例代码3.1 发布者示例(publisher.cpp)3.2 订阅者示例(subscriber.cpp) 4. 机制比较5. 架构比较6. Iceoryx vs Iceoryx2参考资料 0. 引言 Iceoryx2 是一个基于 Rust 实现的开…

10.30.2024刷华为OD

文章目录 HJ20 密码验证合格程序(难过全部例子 list取数左开有闭 [0,3) )HJ21 简单密码HJ22 汽水瓶 (数学游戏...)HJ23 (dic就是map,注意怎么用, 善用values()和keys()函数返回list)语法知识记录 (留意转换的字符怎么拼接) HJ20 密…

【问题记录】解决VMware虚拟机中鼠标侧键无法使用的问题

前言 有项目需要在Linux系统中开发,因为要测试Linux中相关功能,要用到shell,在Windows中开发太麻烦了,因此我选择使用UbuntuXfce4桌面来开发,这里我用到了Linux版本的IDEA,除了快捷键经常和系统快捷键冲突…