现今的网站和应用程序越来越依赖于搜索引擎来提供灵活和高效的搜索体验。而全文搜索则成为这些搜索引擎中最常用的类型之一。
在这篇文章中,我们将讨论如何使用 Fastify 和 ElasticSearch 来实现全文搜索。我们将介绍如何搭建 ElasticSearch 并使用 Fastify 连接到它,以及如何添加搜索功能到我们的应用程序中。
前置条件
在开始本文前,你需要了解以下技术:
- JavaScript(ES6+)
- Node.js
- ElasticSearch
并且,我们将使用到以下 npm 包:
- fastify
- fastify-cors
- @elastic/elasticsearch
搭建 ElasticSearch
为了使用 ElasticSearch 实现全文搜索,我们需要先搭建 ElasticSearch 环境。在此之前你需要安装 Java 环境,以及 ElasticSearch 的安装程序。
安装完成之后,你可以使用以下命令启动 ElasticSearch 服务:
$ sudo systemctl enable elasticsearch.service $ sudo systemctl start elasticsearch.service
然后,在浏览器地址栏输入 http://localhost:9200
可以得到 ElasticSearch 的信息页面,证明服务已经成功开启。
使用 Fastify 连接 ElasticSearch
首先,我们需要安装并引入 @elastic/elasticsearch 包。
$ npm install @elastic/elasticsearch
然后,我们需要创建一个 ElasticSearch 的连接。
const { Client } = require('@elastic/elasticsearch'); const esClient = new Client({ node: 'http://localhost:9200' }); module.exports = esClient;
在这里,我们使用了 ES6 的 import
方法将 @elastic/elasticsearch 包引入,然后创建了一个连接到 ElasticSearch 服务的 Client 实例,并将其暴露出去,以便我们在其他地方调用。
继续,我们需要在 Fastify 中使用这个连接。
-- -------------------- ---- ------- ----- ------- - --------------------- ----- ---- - ------------------------ ----- -------- - --------------------------- ----------------------- ---------------------- ----- ----- ---- -- - ----- - - - - ---------- ----- ------ - ----- ----------------- ------ ------------- ----- - ------ - ------ - ------ - - - - --- ---------------------- --- -------------------- ----- -------- -- - ------------------- --------- -- ------------- ---
在这个示例中,我们创建了一个 Fastify 服务,并使用 fastify-cors
插件避免跨域问题。
然后,在 /search
路由上监听 GET 请求,并获取查询参数中 q
的值,这个值将用于 ElasticSearch 的搜索操作。
我们通过 esClient.search()
方法执行实际的搜索操作。这里将查询关键词传递给 ElasticSearch,会在 index_name
索引中搜索一个与查询关键词匹配的字段,并返回搜索结果。
最后,我们将搜索结果通过 HTTP 响应的形式返回给客户端。
测试
在浏览器地址栏中输入以下 URL:
http://localhost:3000/search?q=my_search_term
这里需要将 my_search_term
替换为你自己的搜索关键词。你应该会看到完整的 JSON 格式的搜索结果。
结论
Fastify 和 ElasticSearch 结合起来实现全文搜索并不是一件困难的事情。使用这种方法,我们可以快速为我们的应用程序添加功能强大的搜索功能。
为了更好地理解,你可以对这个例子进行扩展,添加更多的查询参数,如排序、选择性返回结果和分页。
完整的示例代码可以在 Github 中找到。
来源:JavaScript中文网 ,转载请注明来源 https://www.javascriptcn.com/post/6705d695d91dce0dc8553678