GraphQL 提供了一种高效且灵活的方式来查询数据。本博客将解释 Hasura DDN 如何与 Elasticsearch 协同工作,从而实现对数据的高性能和元数据驱动的访问。
此示例的代码和设置可以在此 GitHub 仓库中找到 - elasticsearch-subgraph-example。
Hasura DDN 是一款为云构建的元数据驱动数据访问层。它自动生成支持事务和分析工作负载的 API。通过利用元数据(例如模型、关系、权限和安全规则),Hasura 创建了针对性能优化的 API,轻松提供低延迟响应并处理高并发需求。
元数据驱动 API 在搜索 AI 世界中的作用
元数据驱动 API 使用声明式方法,而不是手动编码每个端点及其关联的逻辑。数据源(如 Elasticsearch 索引)的结构以标准化格式描述。定义不同实体之间的关系。使用配置在粒度级别指定权限和安全规则。
基于此元数据,API 层会自动预配并与数据源保持同步。
对于 Elasticsearch,使用 Hasura DDN 的元数据驱动 API 提供统一且一致的数据访问。数据的更改会立即反映在 API 中,这对于实时搜索和 AI 应用至关重要。
架构
在上图架构中,Hasura 是连接到多个子图的超级图,Elasticsearch 是子图中数据源之一。
为 Elasticsearch 设置 GraphQL API
此设置将引导您使用 Docker 将 Hasura DDN 连接到本地运行的 Elasticsearch 实例。但是,您可以通过使用正确的凭据更新环境变量轻松切换到 Elastic Cloud。在生产环境中体验 Elasticsearch 的推荐方法是使用 Elastic Cloud,它提供受管理的、可扩展的和安全的部署。
设置:加载示例数据集
git clone https://github.com/hasura/elasticsearch-subgraph-example
将 .env.example
复制到 .env
并为 ELASTICSEARCH_PASSWORD
设置值
使用示例索引在本地启动 Elasticsearch
docker compose up -d
访问 https://127.0.0.1:9200 以验证 Elasticsearch 是否已使用示例数据运行。
Elasticsearch 的 GraphQL 子图
在本节中,我们将设置一个 GraphQL 子图,将 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
在本地启动超级图
ddn run docker-start
在本地构建超级图
ddn supergraph build local
访问 https://console.hasura.io/local/graphql?url=https://127.0.0.1:3000 以开始探索本地超级图。
用于搜索的 GraphQL 查询
现在我们已经设置了 Hasura DDN 并将元数据驱动 API 应用于 Elasticsearch,让我们编写 GraphQL 查询来执行搜索操作。
以下查询突出显示了 Hasura 如何将复杂的搜索和聚合需求转换为简单、声明式的 GraphQL 操作。这些示例不仅展示了 GraphQL 的灵活性,还展示了 Hasura 带来的标准化,使跨不同数据源实现一致的 API 访问。
获取 5 个产品(简单查询)
query searchProducts {
products(limit: 5) {
id
price
name
productId
}
}
获取产品名称匹配“shoes”一词的 5 个产品(带有短语匹配的搜索查询)
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 连接起来,构建一个更大的超级图来满足跨团队的需求。这种组合性通过允许不同的团队以一致、标准化的方式访问相同的 API 端点和数据源来减少技术债务。
无论您是在构建搜索体验还是高级分析仪表板,Hasura 都能让您的团队专注于应用程序逻辑而不是 API 管理,从而提高上市速度并降低运营复杂性。
规模化性能注意事项
结合 Hasura 和 Elasticsearch 的主要优势之一是通过谓词下推实现的优化性能。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 中,每个新需求都需要额外的手动编写的查询。
总结
正如本文所探讨的,Hasura DDN 的 Elasticsearch 连接器为加速 Elasticsearch 的 GraphQL API 和构建组织中更大的超级图(与多个团队协作)开辟了新的可能性。
Hasura 的元数据驱动方法简化了 API 开发,为通过 GraphQL 访问 Elasticsearch 数据提供了快速、一致且安全的层。通过利用谓词下推,Hasura 确保了最佳的搜索性能。详细了解 Hasura 的 Elasticsearch 功能。
我们很期待看到您构建的内容!
Elasticsearch 拥有众多新功能,可帮助您为您的用例构建最佳搜索解决方案。深入了解我们的 示例笔记本 以了解更多信息,开始 免费云试用,或立即在您的 本地机器 上试用 Elastic。
想获得 Elastic 认证?了解下一场 Elasticsearch 工程师培训 什么时候开始!