在 Node.js 中使用 GraphQL 和 Elasticsearch

阅读时长 7 分钟读完

前言

在前端开发中,我们经常需要从后端获取数据,然后展示到页面上。传统的 RESTful API 在这方面已经很成熟了,但是它也有一些不足之处,比如需要多次请求才能获取到全部数据,而且数据格式比较死板。GraphQL 就是为了解决这些问题而生的,它可以让我们通过一次请求获取到所有需要的数据,并且可以根据需求定制数据格式。

而 Elasticsearch 则是一款非常强大的搜索引擎,它可以快速地对海量数据进行搜索、过滤和聚合,而且还支持分布式部署,非常适合大规模应用。

本文将介绍如何在 Node.js 中使用 GraphQL 和 Elasticsearch,希望能够帮助大家更好地理解和应用这两个技术。

准备工作

在开始之前,我们需要先安装一些必要的工具和库:

  • Node.js 和 npm:这是我们的开发环境,可以从官网下载并安装。
  • Elasticsearch:可以从官网下载并安装,也可以使用 Docker 镜像。
  • GraphQL:可以使用 npm 安装,比如 npm install graphql
  • express-graphql:可以使用 npm 安装,比如 npm install express-graphql

使用 GraphQL 查询 Elasticsearch 数据

首先,我们需要在 Node.js 中连接 Elasticsearch,可以使用官方提供的 elasticsearch 库。安装命令如下:

连接 Elasticsearch 的代码如下:

其中 http://localhost:9200 是 Elasticsearch 的默认地址。如果你的地址不同,需要修改成你的地址。

接下来,我们需要定义一个 GraphQL 查询类型,用于查询 Elasticsearch 中的数据。比如我们要查询一个名为 books 的索引中的所有数据,可以定义如下查询类型:

-- -------------------- ---- -------
---- ----- -
  ------ ------
-

---- ---- -
  --- ---
  ------ -------
  ------- -------
  ------------ ------
  ------ ------
-

其中 Query 是查询类型,books 是查询字段,Book 是返回的数据类型,包含 idtitleauthordescriptionprice 五个字段。

接下来,我们需要实现这个查询类型,代码如下:

-- -------------------- ---- -------
----- - -------- ----------- - - -------------------

----- ------ - -------------
  ---- ----- -
    ------ ------
  -

  ---- ---- -
    --- ---
    ------ -------
    ------- -------
    ------------ ------
    ------ ------
  -
---

----- ---- - -
  ------ ----- -- -- -
    ----- - ---- - - ----- ---------------
      ------ --------
      ----- -
        ------ -
          ---------- --
        -
      -
    ---

    ------ ---------------------- -- -------------
  -
--

----- --- - ----------
------------------- -------------
  ------- -------
  ---------- -----
  --------- ----
----

---------------- -- -- ---------------- ------ -- ---------------------------------

其中 buildSchema 函数用于构建 GraphQL Schema,root 对象用于实现查询类型的具体逻辑,graphqlHTTP 函数用于创建一个 GraphQL 服务器。我们将这个服务器监听在 http://localhost:4000/graphql 上。

现在我们可以通过浏览器访问 http://localhost:4000/graphql,打开 GraphQL Playground,然后输入以下查询语句:

-- -------------------- ---- -------
-
  ----- -
    --
    -----
    ------
    -----------
    -----
  -
-

然后点击运行按钮,就可以获取到 Elasticsearch 中的所有书籍数据了。

使用 GraphQL 过滤 Elasticsearch 数据

上面的查询是获取所有数据,但是在实际应用中,我们通常需要根据一些条件来过滤数据。比如我们要查询所有价格大于 50 的书籍,可以定义如下查询类型:

其中 price 是一个参数,表示价格。我们需要修改 root 对象的实现,根据参数来构建 Elasticsearch 查询语句:

-- -------------------- ---- -------
----- ---- - -
  ------ ----- -- ----- -- -- -
    ----- - ---- - - ----- ---------------
      ------ --------
      ----- -
        ------ -
          ------ -
            ------ -
              --- -----
            -
          -
        -
      -
    ---

    ------ ---------------------- -- -------------
  -
--

现在我们就可以通过以下查询语句来获取所有价格大于 50 的书籍了:

-- -------------------- ---- -------
-
  ------------ --- -
    --
    -----
    ------
    -----------
    -----
  -
-

使用 GraphQL 聚合 Elasticsearch 数据

除了过滤数据以外,我们还可以使用 Elasticsearch 进行聚合操作,比如统计每个作者出版的书籍数量。我们可以定义如下查询类型:

其中 authors 查询所有作者的数据,Author 包含 namecount 两个字段,分别表示作者名字和出版的书籍数量。

我们需要修改 root 对象的实现,构建 Elasticsearch 聚合查询语句:

-- -------------------- ---- -------
----- ---- - -
  -------- ----- -- -- -
    ----- - ---- - - ----- ---------------
      ------ --------
      ----- -
        ----- --
        ----- -
          -------- -
            ------ -
              ------ ----------------
            -
          -
        -
      -
    ---

    ------ -------------------------------------------- -- --
      ----- -----------
      ------ ----------------
    ----
  -
--

现在我们就可以通过以下查询语句来获取每个作者出版的书籍数量了:

总结

本文介绍了如何在 Node.js 中使用 GraphQL 和 Elasticsearch,包括如何查询、过滤和聚合 Elasticsearch 数据。希望本文能够帮助大家更好地理解和应用这两个技术,并且提高前端开发的效率和质量。完整的示例代码可以在 GitHub 上查看。

来源:JavaScript中文网 ,转载请注明来源 https://www.javascriptcn.com/post/65572a73d2f5e1655d197da1

纠错
反馈