106、【Ubuntu】【Hugo】搭建私人博客:模糊搜索 Fuse.js(二)

【声明】本博客所有内容均为个人业余时间创作,所述技术案例均来自公开开源项目(如Github,Apache基金会),不涉及任何企业机密或未公开技术,如有侵权请联系删除

背景

上篇 blog
【Ubuntu】【Hugo】搭建私人博客:模糊搜索 Fuse.js(一)

分析了解析 JSON 数据,以及 Fuse.js 不同版本的区别,下面继续

搭建私人博客

fuse.basic.min.js 本身也是 Fuse.js 的一部分,属于基础压缩版本,后面用 Fuse.js 统一指代 fuse.basic.min.js

下面先介绍下模糊搜索

模糊搜索

介绍模糊搜索前,先看一下传统的精确搜索方式:

  • 在搜索框输入【苹果手机】
  • 此时系统只返回完全包含【苹果手机】这四个字的匹配内容
  • 如果文章写的是【iPhone 手机】或【苹果智能手机】,就搜不到,因为精确搜索要求的是全字匹配

然后再来看更智能的模糊搜索:

  • 在搜索框输入【平果手机】(打错字),或【水果机】(谐称),或者【手机苹果】(顺序颠倒)
  • 此时系统依然能猜出用户想找的是【苹果手机】,并返回相关结果

从上面的例子可以看出来,模糊搜索是可以容忍拼写错误,部分匹配,顺序错乱,以及近似词的智能搜索方式

再举些平时可能会发生的例子

输入 精确搜索结果 模糊搜索结果
Gogle 无(拼写错误) 返回 Google
ubntu 返回 Ubuntu
ssh tunnel 返回 SSH tunnel(大小写)

所以平常在 Github,VSCode 里打错字也能搜到东西,因为这些 App 都用了模糊搜索

OK,介绍完模糊搜索概念,下面再来看 Fuse.js

Fuse.js

Fuse.js 是一个轻量级,零依赖的 JavaScript 库,用于在浏览器或 Node.js 中实现快速模糊搜索 ,其 Github 开源仓库地址 https://github.com/krisk/Fuse纯前端内容,无需服务器,并且也支持中文,配置灵活,下面举个例子看其使用方法

  • 假设有以下数据
javascript 复制代码
const books = [
  { title: "《三体》", author: "刘慈欣" },
  { title: "《流浪地球》", author: "刘慈欣" },
  { title: "《基地》", author: "阿西莫夫" }
];
  • Fuse.js 进行模糊搜索
javascript 复制代码
const fuse = new Fuse(books, { keys: ["title", "author"] });

fuse.search("liucixin");      // 匹配【刘慈欣】
fuse.search("san ti");        // 匹配【三体】
fuse.search("liut");          // 可能匹配【刘慈欣】(因为 liut ≈ liu t)

可以看到,即使拼错,少字,空格错位,Fuse.js 也能找到最可能的结果

Fuse.js 核心原理(简化)

Fuse.js 使用 Bitap 算法 + 动态规划,计算两个字符串的编辑距离(把 A 字符串变成 B 字符串,需要最少改动的字母个数),比如

  • kitten -> sitting:需要三步,k -> se -> i,最后补个 g

那么其编辑距离就是 3,然后 Fuse.js 会对每个字段(比如标题,摘要等)计算与关键词匹配的相似度分数,再根据阈值判断是否算匹配,最后按匹配度排序返回结果

Fuse.js 有这么几个特点,使得其非常适合类似 Hugo 这样的静态网站

  • 不需要后端数据库
  • 所有搜索在用户浏览器完成,离线也可以使用,只不过搜索到打不开
  • 首次加载 index.json 后,后续搜索飞快

但不适合

  • 数据量极大(>10万条),内存爆炸(私人博客正常情况下写不了这么多,一个人一生也就 3 万天(包括婴儿和老年),一天写一篇也到不了这么多)
  • 需要复杂查询,比如【价格 < 100 并且品牌 = Apple】,这种用 elasticsearch

简而言之,模糊搜索属于能猜到用户想搜什么的智能搜索,而 Fuse.js 就是可以在网页里轻松实现模糊搜索的 JavaScript 工具,可以让博客,文档站,知识库拥有打错字也能搜到的现代搜索体验,而无需搭建复杂的后端服务,所以 Hugo PaperMod 用的就是这样的一个轻量化搜素引擎

最后再对比下精确搜索和模糊搜索的实现与特点

实现&特点 精确搜索 模糊搜索
是否容错
部分匹配 不支持,必须完整词 可以支持,比如 ubun,可以联想到 Ubuntu
性能 极快(基于哈希表) 快(但需要遍历和计算)
实现难度 简单,indexof,只要知道索引即可 中等,需要算法库
用户体验 差(容错低)

OK,本篇先到这里,如有疑问,欢迎评论区留言讨论,祝各位功力大涨,技术更上一层楼!!!更多内容见下篇 blog
【Ubuntu】【Hugo】搭建私人博客:模糊搜索 Fuse.js(三)

相关推荐
冲刺逆向2 小时前
【js逆向案例六】创宇盾(加速乐)通杀模版
java·前端·javascript
皓月盈江2 小时前
Linux Debian13安装的 VS Code 无法输入中文的问题解决方法
linux·vscode·ubuntu·linux debian13·vscode无法输入中文
我穿棉裤了2 小时前
文字换行自动添加换行符“-”
前端·javascript·vue.js
炽天使3282 小时前
Win11系统下安装 WSL2 + Ubuntu 流程
linux·运维·ubuntu
鱼香rose__2 小时前
tmux和vim
linux·编辑器·vim
毕不了业的硏䆒僧2 小时前
NVIDIA DGX Spark | Ubuntu cuda13.0安装Pytorch GPU版本
pytorch·ubuntu·spark
EverydayJoy^v^2 小时前
RH134学习进程——五.调优系统性能
linux·运维·服务器
小李广2 小时前
修改MS源码—开发新接口:查询所有项目下面的模块
java·linux·服务器
猫猫的小茶馆2 小时前
【Linux 驱动开发】嵌入式 Linux 开发概念
linux·服务器·arm开发·stm32·单片机·嵌入式硬件·mcu