如何使用 Fastify 和 Elasticsearch 进行全文检索

在现代的网站和应用中,全文检索是一项非常重要的功能。为了实现这个功能,我们通常需要将数据存储在一个搜索引擎中,并编写一个可搜索数据的界面。

在本文中,我们将介绍如何使用 Fastify 和 Elasticsearch 来实现全文检索功能。我们将以一个简单的示例为例,该示例将搜索电影数据。以下是我们将开发的搜索引擎的主要功能:

  • 根据关键字搜索电影。
  • 可以过滤电影,比如按年份、类型、演员等。
  • 支持分页。
  • 显示电影的详细信息,包括演员、导演、类型、年份等。

准备工作

在开始编写代码之前,您需要安装以下软件:

  • Node.js
  • Elasticsearch

您还需要安装适当的 Elasticsearch 客户端。在本教程中,我们将使用官方的 Elasticsearch JavaScript 客户端。

要安装此客户端,请打开终端并运行以下命令:

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

创建 Fastify 应用程序

首先,我们将创建一个 Fastify 应用程序。在您的项目根目录中创建一个名为 server.js 的文件。然后在该文件中编写以下代码:

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

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

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

--------

此代码将创建一个简单的 Fastify 应用程序,并将 HTTP GET 请求映射到根 URL。您可以通过在终端中运行以下命令来启动 Fastify 应用程序:

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

现在您可以打开浏览器并访问 http://localhost:3000,将看到 "hello: world" 输出到页面中。

创建 Elasticsearch 索引

接下来,我们需要创建 Elasticsearch 索引来存储我们的电影数据。在终端中运行以下命令创建一个名为 movies 的索引:

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

此命令将创建一个名为 movies 的索引和它所需的属性。在本示例中,我们将存储电影的标题,年份,类型,导演,演员和梗概。每个字段都被定义为文本类型,因为我们需要对这些字段进行全文搜索。

当您运行此命令时,您应该会收到以下响应:

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

插入示例数据

现在我们已经有了一个索引,接下来,我们需要向 Elasticsearch 中插入一些示例数据。在终端中运行以下命令:

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

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

此命令将添加两个电影标题 "The Shawshank Redemption" 和 "The Godfather"。

配置 Elasticsearch 客户端

接下来,我们需要配置 Elasticsearch 客户端。在 server.js 文件中添加以下代码:

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

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

此代码将创建一个 Elasticsearch 客户端,并将其交由 Fastify 应用程序。现在我们可以使用 client 进行 Elasticsearch 相关的所有操作。

执行搜索操作

现在我们已经准备好了所有内容,我们需要执行实际的搜索操作。我们将使用 Elasticsearch 提供的 Query DSL 来构建我们的查询。

server.js 文件中添加以下代码:

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

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

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

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

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

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

此代码将创建一个 /search 端点,该端点接受包含以下参数的 GET 请求:

  • q:要搜索的查询关键词。
  • page:要返回的结果页码。
  • limit:每页要返回的结果数。
  • filter:要应用的筛选器,例如 year:1994

此代码将使用上述参数构建一个查询,然后将该查询发送到 Elasticsearch。查询将返回匹配查询关键词的文档。

完整代码

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

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

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

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

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

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

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

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

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

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

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

--------

结论

在本教程中,我们已经使用 Fastify 和 Elasticsearch 创建了一个简单的全文搜索引擎。我们了解了如何:

  • 创建 Elasticsearch 索引。
  • 插入一些示例数据。
  • 配置 Elasticsearch 客户端。
  • 执行搜索操作。

您可以在此示例代码的基础上继续构建您自己的全文搜索功能。如果您想了解有关 Elasticsearch 高级查询功能的更多信息,请参阅官方文档。

来源:JavaScript中文网 ,转载请注明来源 本文地址:https://www.javascriptcn.com/post/67243ea22e7021665e12c1df