使用 Hapi.js 和 Elasticsearch 实现全文搜索

阅读时长 9 分钟读完

在现代网站和应用程序中,全文搜索已经成为了一个必不可少的功能。然而,实现一个高效的全文搜索需要使用一些非常复杂的数据结构和算法。为了让开发者可以更快速地构建出高效的全文搜索功能,Elasticsearch 已经成为了一种非常流行的选择。在本文中,我们将介绍如何使用 Hapi.js 和 Elasticsearch 来实现全文搜索功能。

什么是 Elasticsearch?

Elasticsearch 是一个开源的搜索引擎,它可以快速地存储、搜索和分析大量的数据。它以 Apache Lucene 作为基础,提供了一个分布式、多租户的全文搜索引擎。它支持实时搜索、自动建议、聚合和分析,并可以扩展到数百台服务器上。

Hapi.js 是什么?

Hapi.js 是一个基于 Node.js 的 Web 框架,它提供了一些非常便捷的工具和插件,使得构建 Web 应用程序变得更加容易。

使用 Hapi 和 Elasticsearch 实现全文搜索

在这个例子中,我们将构建一个简单的全文搜索应用程序,并使用 Hapi.js 作为 Web 框架,Elasticsearch 作为搜索引擎。

步骤 1:创建 Elasticsearch 索引

在我们开始构建应用程序之前,需要先创建一个 Elasticsearch 索引。为了演示,我们将创建一个名为 bookstore 的索引,并建立一个名为 book 的类型,每一个文档表示一本书。

要创建索引,可以使用如下命令:

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

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

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

步骤 2:添加文档到 Elasticsearch 中

接下来,我们需要将一些书籍添加到 Elasticsearch 中。我们将用一个简单的数组来保存它们:

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

然后,我们可以使用 bulk API 将这些文档添加到 Elasticsearch 中:

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

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

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

步骤 3:使用 Hapi.js 构建应用程序

现在,我们已经将一些书籍添加到 Elasticsearch 中了。接下来,我们需要构建一个能够搜索这些书籍的应用程序。我们将使用 Hapi.js 作为 Web 框架,并将其与 Elasticsearch API 进行集成。

我们首先需要安装 hapielasticsearch 的包:

然后,我们将创建一个 server.js 文件,并引入所需的包:

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

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

我们使用 Hapi.Server 创建一个新的服务器,并在端口 3000 上运行它。我们还创建了一个 Elasticsearch 的客户端,并将其连接到默认的 Elasticsearch 地址和端口。

步骤 4:添加搜索路由

接下来,我们将为我们的应用程序添加搜索路由。这个路由将接收一个查询参数,并在 Elasticsearch 中搜索匹配的书籍。

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

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

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

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

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

我们将 /books/search 路由放在了我们的服务器中,并为其提供了一个 handler 函数。这个函数将获取查询字符串参数 q,并将其用作 Elasticsearch 查询的关键字。

我们使用 Elasticsearch 的 multi_match 查询,它可以在多个字段上进行全文搜索,并返回最匹配的结果。我们还指定了每个字段的权重,以便更准确地计算结果。

接下来,我们将使用 client.search 函数来执行搜索。这个函数将 indextypebody 属性作为参数,并返回一个 Elasticsearch 查询结果对象。我们还将从查询结果中提取书籍数据,并将其作为 JSON 对象返回给客户端。

步骤 5:启动服务器并测试

现在,我们已经编写了完整的应用程序,并添加了搜索路由。最后一步是启动服务器并测试它是否正常工作。

我们的服务器已经可以运行了。我们可以使用 Postman 或者浏览器等工具进行测试:

这个请求将搜索所有标题、作者和描述中包含关键字 programming 的书籍。如果一切正常,我们就应该能够看到匹配的书籍列表。

结论

在本文中,我们学习了如何使用 Hapi.js 和 Elasticsearch 来构建一个简单的全文搜索应用程序。我们使用 Elasticsearch 存储和搜索书籍数据,并使用 Hapi.js 作为 Web 框架。我们还演示了如何创建 Elasticsearch 索引、添加文档和执行搜索查询。

这个示例是相当基础的,但是可以作为全文搜索功能的起点。它也可以使用其他数据源和更复杂的搜索查询来构建更高级的应用程序。尝试一下吧!

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

纠错
反馈