增添搜索引擎
增加搜索功能, 支持全部内容搜索
结构选择
| type | description |
|---|---|
| arr | 数组 |
| arrTree | 数组树 |
| kvArr | 键值数组 |
| kvTree | 键值树 |
需求
- 搜索
- 支持全文搜索
- 支持搜索结果高亮
- 支持搜索结果分页
- 支持搜索结果排序
- 详情页面
- 树状侧边导航栏
解析 标题
搜索引擎
Fuse.js 是一个轻量级的 JavaScript 模糊搜索库,专门用于在小型数据集(如数组或对象列表)中快速执行模糊搜索。它非常适合在前端应用中实现搜索功能,尤其是当你需要对非精确匹配的结果进行排序时。
核心功能
-
模糊搜索:
- 支持对字符串进行模糊匹配,例如输入 "appl" 可以匹配到 "apple"。
-
权重配置:
- 可以为对象的不同字段设置权重,影响搜索结果的排序。
-
高性能:
- 适合小型到中型数据集,搜索速度非常快。
-
灵活性:
- 支持多字段搜索、阈值调整、结果高亮等功能。
安装
你可以通过 npm 或 yarn 安装 Fuse.js:
npm install fuse.js或者使用 yarn:
yarn add fuse.js基本用法
示例数据
假设你有以下数据:
const books = [
{ title: "The Great Gatsby", author: "F. Scott Fitzgerald" },
{ title: "To Kill a Mockingbird", author: "Harper Lee" },
{ title: "1984", author: "George Orwell" },
{ title: "The Catcher in the Rye", author: "J.D. Salinger" },
{ title: "The Hobbit", author: "J.R.R. Tolkien" }
];创建 Fuse 实例
import Fuse from "fuse.js";
const options = {
keys: ["title", "author"], // 搜索的字段
threshold: 0.3, // 匹配的模糊程度,0 完全匹配,1 匹配最宽松
};
const fuse = new Fuse(books, options);执行搜索
const result = fuse.search("hobbit");
console.log(result);输出结果
[
{
item: { title: "The Hobbit", author: "J.R.R. Tolkien" },
refIndex: 4
}
]配置选项
常用选项
-
keys:- 指定要搜索的字段(适用于对象数组)。
- 示例:
keys: ["title", "author"]。
-
threshold:- 控制模糊匹配的程度,范围是
0到1。 0表示完全匹配,1表示最宽松的匹配。
- 控制模糊匹配的程度,范围是
-
includeScore:- 是否在结果中包含匹配的分数(
score)。 - 示例:
includeScore: true。
- 是否在结果中包含匹配的分数(
-
includeMatches:- 是否在结果中包含匹配的详细信息(如匹配的字段和位置)。
- 示例:
includeMatches: true。
-
minMatchCharLength:- 设置最小匹配字符长度。
- 示例:
minMatchCharLength: 3。
-
distance:- 控制模糊匹配时的字符距离,默认值为
100。
- 控制模糊匹配时的字符距离,默认值为
高级用法
多字段搜索
如果你的数据是对象数组,可以指定多个字段进行搜索:
const options = {
keys: ["title", "author"],
threshold: 0.4,
};
const fuse = new Fuse(books, options);
const result = fuse.search("George");
console.log(result);权重配置
可以为不同字段设置权重,影响搜索结果的排序:
const options = {
keys: [
{ name: "title", weight: 0.7 },
{ name: "author", weight: 0.3 },
],
};
const fuse = new Fuse(books, options);
const result = fuse.search("George");
console.log(result);高亮匹配
启用 includeMatches 选项,可以获取匹配的详细信息(如匹配的字段和位置):
const options = {
keys: ["title", "author"],
includeMatches: true,
};
const fuse = new Fuse(books, options);
const result = fuse.search("hobbit");
console.log(result);输出结果:
[
{
item: { title: "The Hobbit", author: "J.R.R. Tolkien" },
matches: [
{
indices: [[0, 5]], // 匹配的位置
key: "title", // 匹配的字段
value: "The Hobbit" // 匹配的值
}
]
}
]使用场景
-
前端搜索框:
- 在前端实现实时搜索功能,例如搜索博客文章、商品列表等。
-
多字段搜索:
- 在对象数组中搜索多个字段,例如标题、描述、标签等。
-
模糊匹配:
- 允许用户输入不完全正确的关键词,仍然能找到相关结果。
-
结果排序:
- 根据匹配的分数对结果进行排序,优先显示最相关的结果。
优势和限制
优势
- 轻量级:库本身非常小,适合前端使用。
- 易用性:API 简单,配置灵活。
- 模糊匹配:支持宽松的匹配规则,用户体验更好。
限制
- 适合小型数据集:对于大型数据集(如几万条记录),性能可能会下降。
- 不支持全文搜索:不适合需要全文索引的大型搜索场景(如 Elasticsearch)。
总结
Fuse.js 是一个强大且易用的模糊搜索库,适合在前端实现小型数据集的模糊搜索功能。如果你的数据量较小且需要灵活的模糊匹配,Fuse.js 是一个非常好的选择。
如果你有更复杂的搜索需求(如全文搜索或大规模数据),可以考虑使用更强大的工具,如 Elasticsearch 或 Algolia。

