为Web应用添加Meilisearch全文搜索支持

为Web应用添加Meilisearch全文搜索支持插图

从电子商务平台到内容管理系统 (CMS),网络应用程序会生成和处理大量数据。从这些数据中高效提取相关信息对于实现无缝的用户体验至关重要。因此,使用逐字查询匹配的传统搜索功能是不够的。您需要的是全文搜索。

全文搜索可以检查文档或数据库的完整内容,让您可以根据特定的单词或短语从大型数据集中检索相关信息。它考虑了出现频率和多语言内容等因素,从而获得更准确、更全面的搜索结果。

Meilisearch 是这类搜索引擎中的佼佼者,它利用全文搜索的强大功能,为开发人员和最终用户提供了灵活而强大的工具。

本教程演示如何将 Meilisearch 集成到 Node.js Web 项目中。

什么是 Meilisearch?

Meilisearch 是一个开源搜索引擎,可为最终用户提供快速、相关的搜索结果。它不允许出现错字,默认设置可满足大多数项目的需要。

Meilisearch 还具有很强的可定制性,提供了许多调整搜索结果相关性的功能。在这些功能中,最值得注意的是排名规则,您可以根据自己的项目进行调整。

它提供直观的 RESTful API,可无缝集成到几乎任何企业网站中。您可以自行托管,也可以使用其官方云托管解决方案 Meilisearch Cloud,轻松快速地开始使用。本教程使用 Meilisearch Cloud

前提条件

要继续学习,您需要:

如何设置 Meilisearch

浏览 Meilisearch Cloud,创建账户或登录。确保确认电子邮件地址。

接下来,点击 “Create a project“,一个运行 Meilisearch 实例的服务器,你将在其中添加网站的数据集。

添加 Project name(例如,book-app)并选择您喜欢的地区。然后点击 Create。创建项目后,您可以单击 “Settings” 查看项目的详细信息,如访问数据集的 URL、保护 Meilisearch 实例的 API 密钥以及其他信息。

books-app 项目概览页面

books-app 项目概览页面。

有三个 API 密钥,每个密钥代表不同的授权级别

  • Master key – 此密钥可解锁所有路由,也是唯一可访问端点以创建和删除 API 密钥的密钥。只有使用主密钥才能在受保护的环境中管理 API 密钥。
  • Default Search API key – 该密钥只允许访问搜索路由。可以在客户端代码中使用。
  • Default Admin API key – 该密钥可访问除 /keys 之外的所有 API 路由,后者用于创建和删除 API 密钥。您只能在受保护的环境中使用此密钥。

如何使用 Meilisearch 编制数据索引

索引是存储和组织可搜索数据的核心组件。它们充当文档的容器 – 包含一个或多个字段的对象。

Meilisearch中的每个索引都是独立和可定制的,允许个性化的搜索排序规则和过滤选项。

如何创建索引和添加文档

  1. 在导航栏中,单击项目中的 Indexes 选项卡。
  2. 单击 Create an index。然后,输入索引名称(例如,书籍)并单击 Create index
  3. 选择导入文档的方式。本指南将导入一个 JSON 文件,其中包括来自 Google Book API 的 13 个图书条目。
  4. 单击 File upload 并上传 JSON 文件,然后 Import documents

注:每个文档都必须有一个包含 primary key 的主字段,主键是所有文档中都必须存在的具有唯一值的属性。在大多数情况下,这个值就是文档 ID。如果主键不存在,文档将无法成功上传。

如何更新和删除文档

Meilisearch Cloud 目前不提供修改或删除文档的方法,但您可以使用 REST API 路由或 SDK。下面的代码演示了如何使用 REST API 端点更新或删除文档。本教程使用 cURL 来处理路由,但你也可以使用像 Postman 这样的 API 平台。

1. 要更新文件,请按以下路由发送 PUT 请求:

/indexes/{index_uid}/documents

上面的 index_uid 是项目的索引名称:

 

突出显示索引名称

突出显示索引名称。

2. 使用此路由,可以添加或更新已存在的文档列表。要更新文档,必须附加其主键。旧文档会根据新文档中的字段进行部分更新。以下是一个示例,说明如何将图书索引中文档的标题从 JavaScript for Kids 更新为 JavaScript Coding for Kids ,并添加 publisher 字段:

curl \
-X PUT '/indexes/books/documents' \
-H 'Content-Type: application/json' \
-H 'Authorization: Bearer ' \
--data-binary '[
{
"id": "71nDBQAAQBAJ",
"title": "JavaScript Coding for Kids",
"publisher": "No Starch Press"
}
]'

3. 将 <your-project-url><your-admin-api-key> 替换为 Project overview 页面中的相应值:

"taskUid": 26, "indexUid": "books", "status": "enqueued", "type": "documentAdditionOrUpdate", "equeuedAt": "2023-05-26T07:52:24.127920065Z"

4. 在删除文档方面,Meilisearch 包括三个路由(端点):

/indexes/{index_uid}/documents // Deleting all documents
/indexes/{index_uid}/documents/{document_id} // Deleting a single document
/indexes/{index_uid}/documents/delete-batch // Deleting a selection of  
documents

您可以从 MeiliSearch Cloud 或您的数据库中获取文档后,从 books.json 文件的原始数据中获取 document_id

下面是如何删除上述更新的图书的示例:

curl \
-H 'Authorization: Bearer ' \
-X DELETE '/indexes/books/documents/71nDBQAAQBAJ'

发送请求后,您的回复应该如下所示:

"taskUid": 10, "indexUid": "books", "status": "enqueued", "type": "documentDeletion", "equeuedAt": "2023-05-26T07:20:11.1291066"

如何将 MeiliSearch 添加到网络服务中

1. 首先,在终端运行以下命令,从 GitHub 克隆启动项目:

git clone https://github.com/Tammibriggs/meilisearch-app.git
cd meilisearch​-app
npm install

如果检查 package.json 文件,应该会看到 start 命令。运行 npm start 在 localhost port3000 上运行 Node.js 项目。在浏览器中输入 http://localhost:3000/ 时,应该会看到以下内容:

 

Meilisearch 演示启动程序

Meilisearch 演示启动程序。

2. 应用程序启动并运行后,就可以添加 Meilisearch,这样搜索表单在提交时就会开始返回来自 Meilisearch 的结果。为此,请在终端执行以下命令安装 Meilisearch:

npm install meilisearch

3. 您还需要安装 dotenv npm 软件包,以便从 .env 文件加载敏感凭据。在终端运行以下命令

npm install dotenv

4. 在项目根文件夹中创建一个 .env 文件,并添加以下内容:

YOUR_PROJECT_URL= '<your-project-url>'
YOUR_SEARCH_API_KEY= '<your-admin-api-key>'

确保将 <your-project-url><your-admin-api-key> 替换为相应的值。

5. 接下来,在 server.js 文件中导入 meilisearchdotenv 软件包,并配置 dotenv

import {MeiliSearch} from 'meilisearch'
import dotenv from 'dotenv';
dotenv.config();

6. 然后,初始化 Meilisearch,这样你就可以开始处理你的 books-app 项目了。导航到 server.js 文件,在 searchValue 变量定义后添加以下代码:

const client = new MeiliSearch({ host: process.env.YOUR_PROJECT_URL, apiKey: process.env.YOUR_SEARCH_API_KEY })

7. 其中一项重要功能是在提交表单时,使用附加到 URL 的搜索值在 Meilisearch 中搜索图书索引。要启用此功能,请在 client 变量定义后添加以下代码:

const index = client.index('books')  
const searchResults = !!searchValue && await index.search(searchValue)

这段代码会创建一个图书索引的引用。然后,如果您定义了 searchValue,它将使用 search() 方法在图书索引中搜索与搜索值相匹配的文档。

8. 最后,修改 render() 方法如下,以显示搜索结果:

res.render('index', {
books: searchResults ? searchResults.hits : [],
searchValue
})

现在您可以开始搜索图书索引了:

使用搜索表单搜索 "books" 索引

使用搜索表单搜索 “books” 索引

9. 添加上述代码后,您的 server.js 文件应如下所示:

import express from 'express';
import { MeiliSearch } from 'meilisearch';
import dotenv from 'dotenv';
dotenv.config();
const app = express();
const PORT = process.env.PORT || 3000;
app.set('view engine', 'ejs');
app.use(express.static('public'));
app.get('/', async (req, res) => {
const searchValue = req.query.search;
const client = new MeiliSearch({
host: process.env.YOUR_PROJECT_URL,
apiKey: process.env.YOUR_SEARCH_API_KEY,
});
const index = client.index('books');
const searchResults = !!searchValue && (await index.search(searchValue));
res.render('index', {
books: searchResults ? searchResults.hits : [],
searchValue,
});
});
app.listen(PORT, () => {
console.log(`listening at http://localhost:${PORT}`);
});

您可以在 GitHub 上访问本教程的完整代码

小结

Meilisearch 是一款出色的搜索引擎解决方案,可增强网站的搜索功能和用户体验。其卓越的速度、以相关性为重点的排名算法和无缝集成过程使其成为优化网站搜索功能的宝贵工具。

您的项目依赖哪种搜索引擎?请在评论区告诉我们!

评论留言