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

相关推荐
猎人everest1 小时前
SpringBoot应用开发入门
java·spring boot·后端
狮歌~资深攻城狮6 小时前
HBase性能优化秘籍:让数据处理飞起来
大数据·hbase
Elastic 中国社区官方博客6 小时前
Elasticsearch Open Inference API 增加了对 Jina AI 嵌入和 Rerank 模型的支持
大数据·人工智能·elasticsearch·搜索引擎·ai·全文检索·jina
孤雪心殇6 小时前
简单易懂,解析Go语言中的Map
开发语言·数据结构·后端·golang·go
隔壁老王1567 小时前
mysql实时同步到es
数据库·mysql·elasticsearch
workflower7 小时前
Prompt Engineering的重要性
大数据·人工智能·设计模式·prompt·软件工程·需求分析·ai编程
小突突突8 小时前
模拟实现Java中的计时器
java·开发语言·后端·java-ee
web137656076438 小时前
Scala的宝藏库:探索常用的第三方库及其应用
开发语言·后端·scala
SunnyRivers8 小时前
关于ES中text类型时间字段范围查询的结构化解决方案
elasticsearch·时间·text·范围查询
闲猫9 小时前
go 反射 interface{} 判断类型 获取值 设置值 指针才可以设置值
开发语言·后端·golang·反射