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(三)

相关推荐
wdfk_prog2 小时前
[Linux]学习笔记系列 -- [drivers][input]input
linux·笔记·学习
盟接之桥3 小时前
盟接之桥说制造:引流品 × 利润品,全球电商平台高效产品组合策略(供讨论)
大数据·linux·服务器·网络·人工智能·制造
Moment3 小时前
富文本编辑器在 AI 时代为什么这么受欢迎
前端·javascript·后端
忆~遂愿3 小时前
ops-cv 算子库深度解析:面向视觉任务的硬件优化与数据布局(NCHW/NHWC)策略
java·大数据·linux·人工智能
湘-枫叶情缘3 小时前
1990:种下那棵不落叶的树-第6集 圆明园的对话
linux·系统架构
爱敲代码的小鱼3 小时前
AJAX(异步交互的技术来实现从服务端中获取数据):
前端·javascript·ajax
Fcy6484 小时前
Linux下 进程(一)(冯诺依曼体系、操作系统、进程基本概念与基本操作)
linux·运维·服务器·进程
袁袁袁袁满4 小时前
Linux怎么查看最新下载的文件
linux·运维·服务器
代码游侠4 小时前
学习笔记——设备树基础
linux·运维·开发语言·单片机·算法
Gary Studio4 小时前
rk芯片驱动编写
linux·学习