在现代互联网时代,搜索引擎扮演着极其重要的角色。许多企业和开发者都在尝试构建自己的搜索引擎,以提供更好的搜索结果和体验。而使用 Node.js 和 Express 框架,我们可以快速构建一个高效的搜索引擎,本文将详细介绍如何实现。
第一步:创建项目
首先,我们需要创建一个 Node.js 项目。打开命令行,输入以下命令:
mkdir search-engine cd search-engine npm init -y
然后,我们需要安装 Express 和其他依赖:
npm install express body-parser morgan consolidate elasticlunr --save
其中,body-parser
用于解析 http 请求数据,morgan
用于记录日志,consolidate
用于连接 view engine,并支持许多模板引擎,elasticlunr
用于提供全文搜索的支持。
第二步:建立服务器
在 search-engine
文件夹下,创建 index.js
文件,并输入以下内容:
// javascriptcn.com 代码示例 const express = require('express'); const bodyParser = require('body-parser'); const morgan = require('morgan'); const app = express(); app.use(bodyParser.json()); app.use(morgan('combined')); const port = process.env.PORT || 3000; app.listen(port, () => { console.log(`Server is listening on port ${port}`); });
这个文件用于建立一个服务器,并监听 3000 端口。我们使用了 body-parser
和 morgan
中间件,以解析请求和记录日志。
在命令行中输入 node index.js
可以启动服务器。
第三步:建立数据模型
我们需要定义数据模型,以便于储存和查询数据。在 search-engine
文件夹下,创建 data.js
文件,并输入以下内容:
// javascriptcn.com 代码示例 const elasticlunr = require('elasticlunr'); const documents = [ { id: 1, title: 'Apple', content: 'An apple is a sweet, edible fruit produced by an apple tree.', }, { id: 2, title: 'Banana', content: 'A banana is an elongated, edible fruit – botanically a berry.', }, { id: 3, title: 'Cherry', content: 'A cherry is the fruit of many plants of the genus Prunus.', }, ]; const index = elasticlunr(function () { this.addField('title'); this.addField('content'); this.setRef('id'); documents.forEach((doc) => { this.addDoc(doc); }); }); module.exports = { index, documents };
这个文件定义了一个简单的数据集合,包含了 3 个文档,每个文档有 id
、title
和 content
三个字段。同时,我们使用 elasticlunr
库,创建一个新的索引,并且将文档添加到索引中。
第四步:实现查询接口
我们需要实现一个查询接口,用于接收查询请求,并返回结果。在 search-engine
文件夹下,创建 search.js
文件,并输入以下内容:
// javascriptcn.com 代码示例 const express = require('express'); const { index, documents } = require('./data'); const router = express.Router(); router.get('/', (req, res) => { res.render('search'); }); router.post('/', (req, res) => { const { query } = req.body; const results = index.search(query); const data = results.map((result) => { const doc = documents.find((doc) => doc.id === result.ref); return doc; }); res.render('search', { query, data }); }); module.exports = router;
这个文件定义了一个接口路由,包括 GET /
和 POST /
两个路由。其中,GET /
返回一个 html 页面,用于查询输入;POST /
接收查询请求,并且返回结果列表。
在 search
路由的 POST /
路由中,我们使用 elasticlunr
库,进行全文搜索,并返回结果。然后,我们根据文档 ID,找到对应的文档,将结果返回给客户端。
第五步:实现视图层
最后,我们需要实现视图层。在 search-engine
文件夹下,创建 views/search.pug
文件,并输入以下内容:
// javascriptcn.com 代码示例 doctype html html(lang="en") head title Search Engine body form(method="post") input(type="text", name="query") input(type="submit") if ('data' in locals) ul each doc in data li h3= doc.title p= doc.content
这个文件定义了一个简单的查询输入框和结果列表。如果查询到结果,会将结果列表展示出来。
第六步:运行程序
现在,我们可以运行程序,测试搜索引擎是否正常工作。在命令行输入 node index.js
启动服务器,然后使用浏览器访问 http://localhost:3000
,输入查询语句,即可看到查询结果。
总结
使用 Node.js 和 Express 框架,我们可以快速构建一个高效的搜索引擎。本文介绍了从搭建项目、建立数据模型、实现查询接口、构建视图层等整个过程。透过这个例子,我们可以学到许多建立现代 web 应用的关键点,例如中间件、路由、模板引擎、数据储存、全文索引等等。希望读者在实践过程中加深学习,并且成功构建自己的搜索引擎。
来源:JavaScript中文网 ,转载请注明来源 本文地址:https://www.javascriptcn.com/post/653b29697d4982a6eb57df17