增添搜索引擎

增加搜索功能, 支持全部内容搜索

结构选择

typedescription
arr数组
arrTree数组树
kvArr键值数组
kvTree键值树

需求

  • 搜索
    • 支持全文搜索
    • 支持搜索结果高亮
    • 支持搜索结果分页
    • 支持搜索结果排序
  • 详情页面
  • 树状侧边导航栏

解析 标题

搜索引擎

Fuse.js 是一个轻量级的 JavaScript 模糊搜索库,专门用于在小型数据集(如数组或对象列表)中快速执行模糊搜索。它非常适合在前端应用中实现搜索功能,尤其是当你需要对非精确匹配的结果进行排序时。


核心功能

  1. 模糊搜索

    • 支持对字符串进行模糊匹配,例如输入 "appl" 可以匹配到 "apple"。
  2. 权重配置

    • 可以为对象的不同字段设置权重,影响搜索结果的排序。
  3. 高性能

    • 适合小型到中型数据集,搜索速度非常快。
  4. 灵活性

    • 支持多字段搜索、阈值调整、结果高亮等功能。

安装

你可以通过 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

    • 控制模糊匹配的程度,范围是 01
    • 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" // 匹配的值
      }
    ]
  }
]

使用场景

  1. 前端搜索框

    • 在前端实现实时搜索功能,例如搜索博客文章、商品列表等。
  2. 多字段搜索

    • 在对象数组中搜索多个字段,例如标题、描述、标签等。
  3. 模糊匹配

    • 允许用户输入不完全正确的关键词,仍然能找到相关结果。
  4. 结果排序

    • 根据匹配的分数对结果进行排序,优先显示最相关的结果。

优势和限制

优势

  • 轻量级:库本身非常小,适合前端使用。
  • 易用性:API 简单,配置灵活。
  • 模糊匹配:支持宽松的匹配规则,用户体验更好。

限制

  • 适合小型数据集:对于大型数据集(如几万条记录),性能可能会下降。
  • 不支持全文搜索:不适合需要全文索引的大型搜索场景(如 Elasticsearch)。

总结

Fuse.js 是一个强大且易用的模糊搜索库,适合在前端实现小型数据集的模糊搜索功能。如果你的数据量较小且需要灵活的模糊匹配,Fuse.js 是一个非常好的选择。

如果你有更复杂的搜索需求(如全文搜索或大规模数据),可以考虑使用更强大的工具,如 Elasticsearch 或 Algolia。