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

AI 编程助手,豆包旗下的编程助手,提供智能补全、智能预测、智能问答等能力,节省开发时间,释放脑海中的创造力,支持 VSCode,点击体验 AI

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

在本文中,我们将介绍如何使用 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


猜你喜欢

  • ES8 中加入 SharedArrayBuffer,团队可共享数据,让 WebAssembly 的并行计算更胜一筹

    ES8 中加入 SharedArrayBuffer,团队可共享数据,让 WebAssembly 的并行计算更胜一筹 随着计算机技术的不断发展,Web 应用程序的性能需求也越来越高。

    8 天前
  • 如何在 Docker-swarm 集群中使用 Jupyter notebook

    如何在 Docker-swarm 集群中使用 Jupyter notebook 随着云计算和大数据技术的发展,数据科学家和研究人员需要一个强大的编程环境来处理和可视化大量的数据。

    8 天前
  • React 应用如何从 Create React App 迁移到 Next.js?

    React 是一个流行的前端框架,许多团队使用 Create React App 来快速搭建应用程序。但是,当应用程序需要更高级的功能,例如服务器渲染和静态生成,就可以考虑使用 Next.js。

    8 天前
  • 使用 SaaS Headless CMS 的弊端及建议解决方案

    随着互联网的快速发展和使用规模的扩大,现代化的网站和应用程序要求更加丰富的内容和更高的应用性能。为解决这些问题,现代化的网站和应用程序采用更加先进而复杂的 CMS 系统,其中 SaaS Headles...

    8 天前
  • CRUD 操作的 Serverless 实现方式

    随着云计算和无服务器技术的发展,Serverless 架构已经成为了更加流行的异构分布式架构之一,其灵活性和可扩展性因其不依赖固定的服务器而得到广泛的应用。前端开发人员也可以利用 Serverless...

    8 天前
  • MongoDB 架构设计优化实践

    随着互联网的发展,数据量呈爆炸式增长,如何存储、管理、利用数据已经成为了各个企业、组织以及个人都需要面对的问题。MongoDB 作为一种非关系型数据库,具有高可扩展性、高性能以及灵活的数据模型等特点,...

    8 天前
  • Promise 中的 catch 方法失效?试试这个解决方案!

    在前端开发中,我们经常使用 Promise 实现异步操作。而 Promise 对象提供的 then 和 catch 方法是我们常用的操作。这两个函数在 Promise 链中起到了很重要的作用。

    8 天前
  • CSS Reset 更应该怎样用

    CSS Reset 是一种在编写 Web 页面时使用的技术,用于重置 HTML 元素的默认样式。在实际应用中,CSS Reset 通常用于消除不同浏览器之间的兼容性问题,提高页面展示效果的一致性。

    8 天前
  • Flexbox 指南:学习绝佳的 CSS3 布局方式

    CSS3 的出现,让前端布局更为灵活,尤其是 Flexbox 布局方式,成为了众多前端开发者的首选。它有效地解决了传统布局的繁琐和局限性,使前端布局更加轻松和自由。

    8 天前
  • GraphQL 中如何使用 Fragment 进行代码重用?

    GraphQL 是一种用于构建 API 的查询语言,它允许客户端定义自己的查询和数据要求,而无需先前约定的 REST API 一样进行多次请求或者一次超大请求。GraphQL 的一个重要特性是它允许开...

    8 天前
  • PM2 如何实现 Node.js 应用程序的热更新和热重载

    介绍 PM2 是一个流行的 Node.js 进程管理器,可以用于启动、监视、停止 Node.js 应用程序。除此之外,PM2 还支持实现应用程序的热更新和热重载。本文将详细介绍 PM2 如何实现这两个...

    8 天前
  • JavaScript 经典面试题笔记 - 这就是 ES11(ECMAScript2020)里的 Nullish 合并运算符

    在 JavaScript 面试中,经常会被问到有关 Nullish 合并运算符的问题。Nullish 合并运算符是 ES11 (ECMAScript2020)中引入的一个新特性,它是一个非常实用且方便...

    8 天前
  • Material Design 在 Web 响应式设计中的最佳实践

    随着用户对于网页和应用的期望越来越高,Web 响应式设计变得越来越重要。Material Design 是一种在移动和 Web 设计中广泛使用的设计语言,它通过提供一种易于使用、视觉明显且直观的用户体...

    8 天前
  • 服务器宕机?无服务架构帮你实现高可用

    前言 在现代应用程序开发中,高可用性是至关重要的,因为业务需求对这种可靠性和高性能有着越来越高的要求。如果我们依赖于单一服务器运行应用程序,只要服务器宕机,就会导致整个应用程序不可用。

    8 天前
  • Socket.io 如何优化代码以提升性能?

    Socket.io 是一个用于实现实时通信的 JavaScript 库,它在前端开发中应用广泛。但是,在实现实时通信时,Socket.io 也会面临一些性能问题。本文将向您介绍如何优化 Socket....

    8 天前
  • ECMAScript 2019 对正则表达式的新特性详解

    ECMAScript 2019 在正则表达式方面带来了一些新特性,这些新特性可以让开发者更加高效地编写正则表达式,并提升代码的可读性。 本文将对这些新特性进行详细的介绍,并提供示例代码供读者学习和参考...

    8 天前
  • 利用 Node.js 实现高并发处理的关键技术

    在当今的互联网时代,随着用户量的不断增加,对于网站的访问量和并发访问量也在不断提升,这时一个网站能够支持的并发访问量就成为了一个非常重要的指标。Node.js 作为一款快速、高效且易于学习的全栈 Ja...

    8 天前
  • 在 Deno 中使用 MongoDB 的方法

    简介 Deno 是一个现代化的 JavaScript 和 TypeScript 运行时,它旨在提供安全、可维护和可扩展的应用程序开发环境。MongoDB 是一个流行的NoSQL数据库,它以面向文档的方...

    8 天前
  • ES7 Async/await 和 Promise 详解

    最近几年,ES7 引入了两个新特性 async 和 await,这两个关键字使得 JavaScript 异步编程变得更加简单,让我们摆脱了 jQuery Callback Hell 的可怕场景。

    8 天前
  • 解决响应式设计中文字大小不一致的问题

    在响应式设计中,我们经常会遇到字体大小不一致的问题。当移动设备的宽度小于一定阈值时,我们可能需要将字体缩小以适应屏幕大小,但这样可能会使得一些字体显得特别小,甚至难以阅读。

    8 天前

相关推荐

    暂无文章