Fuse.js 的原理:背后的算法与机制

前言

了解 Fuse.js 的原理,有助于我们更好地理解它的强大之处以及它是如何实现高效模糊搜索的。Fuse.js 的核心原理主要涉及两个方面:模糊搜索算法数据结构处理

模糊搜索算法

Fuse.js 使用了一种基于 Bitap 算法(也叫做 Shift-Or、Shift-And 算法)的模糊搜索机制。该算法非常适合用于实现不精确匹配的字符串搜索,以下是其关键点:

Bitap 算法简介

Bitap 算法是一种经典的字符串匹配算法,通过将模式字符串表示为二进制位,利用位操作快速地找到可能的匹配。它特别适用于模糊搜索,因为可以通过位操作来计算编辑距离(如插入、删除和替换字符的次数)。

Bitap 算法的特点:

  1. 高效匹配:通过位操作进行快速匹配。
  2. 容错性:允许一定的错误(拼写错误、部分匹配等)。
  3. 灵活性:可以调整匹配的严格程度。

具体实现步骤

  1. 模式字符串转换为二进制位:
  • 将每个字符映射为一个二进制位,表示字符是否出现在特定位置。
  1. 位掩码(Bit Mask)操作:
  • 对每个输入字符执行位操作,以检测模式字符串在输入中的匹配位置。
  1. 计算编辑距离:
  • 通过位移和位操作计算模式和输入字符串之间的最小编辑距离。
  1. 返回匹配结果:
  • 识别出所有符合条件的匹配结果返回给用户。

数据结构处理
除了算法本身,Fuse.js 还在数据结构处理上进行了优化,使得它不仅能够匹配单一字段,还能处理复杂的多字段、多层次数据结构。

数据索引与权重

  1. 预处理数据:
  • 在初始化时,Fuse.js 会对数据进行预处理,将索引字段提取出来,并根据用户配置的权重进行排序和保存。
  1. 动态权重调整:
  • 在搜索过程中,根据用户输入的关键词动态计算每个字段的匹配得分,并根据权重进行结果排序。

搜索选项配置

Fuse.js 提供了一系列配置选项,允许用户调整搜索行为以适应不同的需求。这些配置选项包括但不限于:

  1. keys:指定需要搜索的字段。
  2. threshold:设置匹配的敏感度。
  3. distance:控制在字符串中字符之间的最大距离。
  4. maxPatternLength:限制模式字符串的最大长度。
  5. minMatchCharLength:限制最小匹配字符长度。

结果排序与过滤

  1. 相关性排序:
  • Fuse.js 会根据编辑距离和字段权重对结果进行排序,使最相关的结果排在最前面。
  1. 结果过滤:
  • 用户可以通过配置选项决定是否包含匹配得分、匹配位置等额外信息,从而根据需要对结果进行进一步处理。

案例:如何解析一个简单搜索请求

让我们通过一个简单的例子来讲解 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' },
];

我们想要搜索包含“Gatsby”的书籍。

  1. 初始化实例:
const options = {keys: ['title', 'author'],threshold: 0.3
};
const fuse = new Fuse(books, options);
  1. 执行搜索:
const result = fuse.search('Gatsby');
  1. Bitap 算法匹配:
  • 对每个 title 和 author 字段执行 Bitap 算法匹配,计算编辑距离。
  • 在匹配过程中,利用位操作快速计算出可能的匹配位置。
  1. 计算相关性得分:
  • 根据字段权重和匹配得分计算最终得分。
  1. 排序与返回结果:
  • 对匹配结果进行排序,将最相关的结果放在前面。
  • 返回最终的匹配结果给用户。

通过上述步骤,Fuse.js 能够高效、准确地返回用户所需的搜索结果。

总结

Fuse.js 通过高效的 Bitap 算法和灵活的数据结构处理,实现了强大的模糊搜索功能。它不仅能够处理简单的字符串匹配,更能应对复杂的多字段、多层次数据结构。了解其背后的原理,有助于我们更好地使用和优化 Fuse.js,为用户提供更好的搜索体验。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/diannao/56865.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

什么是不同类型的微服务测试?

大家好,我是锋哥。今天分享关于【什么是不同类型的微服务测试?】面试题?希望对大家有帮助; 什么是不同类型的微服务测试? 1000道 互联网大厂Java工程师 精选面试题-Java资源分享网 微服务架构中的测试可以分为多种类…

WPF基础权限系统

一.开发环境 VisualStudio 2022NET SDK 8.0Prism 版本 8.1.97Sqlite 二. 功能介绍 WPF 基础权限系统,是一个支持前后端分离设计的 客户端(C/S)项目,该示例项目前端xaml使用UI库 ,Material Design Themes UI 来构建用户界面,确保…

【into outfile写文件】

简介 select * from user into outfile C:/Users/ichunqiu/Desktop/PhpStudy2018/PHPTutorial/WWW/1.txt;用法的意思就是把user表中查询到的所有字段都导出到1.txt文件中 我们之前还有学到dumpfile,单是它只能导出一条数据 写入shell 测试注入点 usernameadmin&…

【工具】使用perf抓取火焰图

背景 当程序存在cpu性能问题时,我们需要找到是哪个函数占用较多的CPU,也就是找出热点函数;perf的火焰图就是这个用途 安装 在Linux系统中,perf 是 Linux 内核提供的性能分析工具,它通常包含在内核源代码包中。大多数…

编码方式知识整理【ASCII、Unicode和UTF-8】

编码方式 一、ASCII编码二、Unicode 编码三、UTF-8编码四、GB2312编码五、GBK编码 计算机中对数据的存储为二进制形式,但采用什么样的编码方式存储,效率更高。主要编码方式有 ASCII、Unicode、UTF-8等。 英文一般为1个字节,汉字一般为3个字节…

Linux 线程互斥

1.相关背景概念 临界资源&#xff1a;多线程执行流共享的资源就叫做临界资源 临界区&#xff1a;每个线程内部&#xff0c;访问临界资源的代码&#xff0c;就叫做临界区 #include <iostream> #include <pthread.h> #include <string> #include <vector…

mac安装jdk8

这里写自定义目录标题 一、下载JDK8二、安装JDK8三、配置环境变量3.1 找到JDK安装目录3.2 打开终端&#xff1a;3.3 输入如下配置&#xff1a;3.3 查看配置是否成功&#xff1a; 一、下载JDK8 oracle官网下载或从下面链接获取 https://download.csdn.net/download/qq_44107684…

【小沐学Golang】基于Go语言搭建静态文件服务器

文章目录 1、简介2、安装2.1 安装版2.2 压缩版 3、基本操作3.1 go run3.2 go build3.3 go install3.4 go env3.5 go module 4、文件服务器4.1 filebrowser4.2 gohttpserver4.3 goFile 5、FAQ5.1 go.mod 为空5.2 超时 结语 1、简介 https://golang.google.cn/ Go语言诞生于2007…

day02 -- docker

1.docker的介绍 Docker 是一个开源的应用容器引擎&#xff0c;基于 Go语言 并遵从 Apache2.0 协议开源。Docker 可以让开发者打包他们的应用以及依赖包到一个轻量级、可移植的容器中&#xff0c;然后发布到任何流行的 Linux 机器上&#xff0c;也可以实现虚拟化。容器是完全使…

●day 35 动态规划part01

第九章 动态规划part01 动态规划的类别 理论基础 动态规划下五步曲&#xff1a; 1、确定dp数组&#xff08;dp table&#xff09;以及下标的含义 2、确定递推公式 3、dp数组如何初始化 4、确定遍历顺序 5、打印dp数组 代码随想录 斐波那契数 代码随想录 动态规划5部曲 cla…

高级语言源程序转换为可执行目标文件

将高级语言源程序转换为可执行目标文件的过程通常包括以下几个主要步骤&#xff1a; ​ 1. 预处理&#xff08;Preprocessing&#xff09;&#xff1a; 由谁完成预处理器&#xff08;cpp&#xff09;操作处理源代码中的预处理指令&#xff08;如宏定义、文件包含、条件编译等&…

Linux——动态卷的管理

确保已经设置了对应的动态卷的驱动&#xff08;provisioner 制备器&#xff09;基于动态驱动创建对应的存储类创建PVC &#xff08;PVC 将会自动根据大小、访问模式等创建PV&#xff09;Pod的spec 中通过volumes 和 volumemounts 来完成pvc 的绑定和pvc对应pv的挂载删除pod 不…

Linux网络编程(七)-TCP协议客户端及代码实现

1.TCP的客户端代码流程简述 这一章将为大家讲解Socket通信中客户端的实现过程&#xff0c;还是先上图&#xff0c;请大家了解客户端的步骤 可以看到&#xff0c;相比服务端&#xff0c;客户端的步骤简单的很多。事实上这种情况比较多&#xff0c;比如一个服务端会有多个客户端…

JMeter模拟并发请求

PostMan不是严格意义上的并发请求工具&#xff0c;实际是串行的&#xff0c;如果需要测试后台接口并发时程序的准确性&#xff0c;建议采用JMeter工具。 案例&#xff1a;JMeter设置20个并发卖票请求&#xff0c;查看后台是否存在超卖的情况 方式一&#xff1a;一共10张票&…

TrickMo 安卓银行木马新变种利用虚假锁屏窃取密码

近期&#xff0c;研究人员在野外发现了 TrickMo Android 银行木马的 40 个新变种&#xff0c;它们与 16 个下载器和 22 个不同的命令和控制&#xff08;C2&#xff09;基础设施相关联&#xff0c;具有旨在窃取 Android 密码的新功能。 Zimperium 和 Cleafy 均报道了此消息。 …

编写一个通用的i2c控制器驱动框架

往期内容 I2C子系统专栏&#xff1a; I2C&#xff08;IIC&#xff09;协议讲解-CSDN博客SMBus 协议详解-CSDN博客I2C相关结构体讲解:i2c_adapter、i2c_algorithm、i2c_msg-CSDN博客内核提供的通用I2C设备驱动I2c-dev.c分析&#xff1a;注册篇内核提供的通用I2C设备驱动I2C-dev.…

时空数据时序预测模型: HA、VAR、GBRT、GCN、DCRNN、FCCF、ST-MGCN

HA (Historical Average) HA (Historical Average&#xff0c;历史平均模型) 是一种基础的时间序列预测方法&#xff0c;通常用于预测具有周期性或季节性规律的数据。它通过计算历史上同一时间段的平均值来预测未来值&#xff0c;假设数据会遵循某种周期性的变化模式。以下是对…

智能家居的“眼睛”:计算机视觉如何让家更智能

引言 在不远的未来&#xff0c;当我们走进家门&#xff0c;灯光自动亮起&#xff0c;空调已经调至最舒适的温度&#xff0c;甚至音乐也播放着我们最喜欢的歌曲。 这一切&#xff0c;都得益于智能家居系统的发展。而在这个系统中&#xff0c;计算机视觉技术扮演着至关重要的角色…

SpringBoot车辆管理系统:构建与优化

4系统概要设计 4.1概述 本系统采用B/S结构(Browser/Server,浏览器/服务器结构)和基于Web服务两种模式&#xff0c;是一个适用于Internet环境下的模型结构。只要用户能连上Internet,便可以在任何时间、任何地点使用。系统工作原理图如图4-1所示&#xff1a; 图4-1系统工作原理…

群晖通过 Docker 安装 MySQL

1. 打开 Docker 应用&#xff0c;并在注册表搜索 MySQL 2. 下载 MySQL 镜像&#xff0c;并选择版本 3. 在 Docker 文件夹中创建 MySQL&#xff0c;并创建子文件夹 4. 设置权限 5. 选择 MySQL 映像运行&#xff0c;创建容器 6. 配置 MySQL 容器 6.1 使用高权限执行容器 6.2 启…