Fuse.js 是一个功能强大、轻量级的模糊搜索插件

Fuse.js 是一个功能强大、轻量级的模糊搜索插件

Fuse.js 是一个功能强大、轻量级的模糊搜索插件,通过提供简单的 api 调用,达到强大的模糊搜索效果,无需搞懂复杂的模糊搜索算法。

什么是模糊搜索?

对于大多数前端开发者来说,搜索领域的知识储备往往是一片空白。一般来说,模糊搜索是查找和输入关键词相近的字符串的搜索结果的技术,准确地说应该称为近似字符串匹配。

Fuse.js 的技术特点

简单代码,实现模糊搜索、处理搜索,甚至不需要后端开发技术

数据量大的情况下表现优秀,性能很好

无 DOM 依赖,既可以在前端使用,也支持在 node.js 后端使用

强大的搜索支持:不仅支持搜索字符串数组、对象数组,支持嵌套搜索、加权搜索等

开发上手和使用建议

对于开发者来说,精确搜索的结果更精准,实现起来也很简单,只需要做字符串匹配即可,但这样的用户体验并不好,因为对于用户来说,键入的关键词往往是不精准的,很多时候因为输入不够规范、不够准确而导致没有搜索结果。

而模糊搜索通过匹配相似的结果,即使输入的关键词有错漏,也能“猜测”到用户想要的结果,大大提高搜索体验。Fuse.js 就是一个 JavaScript 语言下实现模糊搜索的工具库。

安装 Fuse.js

Fuse.js 支持多种方式安装使用,可以直接在 Vue 项目中使用:

npm 

npm install --save fuse.js// yarn 安装yarn add fuse.js

cdn

如果是在浏览器页面中使用,直接引入<script>标签即可:

<script src="//repo.bfw.wiki/bfwrepo/js/fuse.min.js"></script>

使用

// 搜索数据
const list = [
 
{
   
"title": "Old Man's War",
   
"author": {
     
"firstName": "John",
     
"lastName": "Scalzi"
   
}
 
},
 
{
   
"title": "The Lock Artist",
   
"author": {
     
"firstName": "Steve",
     
"lastName": "Hamilton"
   
}
 
},
....
];

// 搜索配置,可查看官网文档了解参数
const options = {
  keys
: [
   
"title",
   
"author.firstName"
 
]
};
// 实例化 Fuse
const fuse = new Fuse(list, options);

// 传入搜索关键词,返回搜索结果
const pattern = "clolny"
return fuse.search(pattern)

Fuse.js 有2个构建版本:

基础版:仅包含标准模糊搜索的版本,轻量小巧

完整版:包含标准模糊搜索、扩展搜索和逻辑查询操作,占用空间较大

一般的标题、内容搜索,使用基础版本就能满足需求。

除了基本的搜索支持,Fuse.js 支持更高级的嵌套搜索、加权搜索和扩展搜索,对搜索算法有更高要求的开发者可以去阅读文档研究。

官网:https://fusejs.io/

示例代码:

<!DOCTYPE html>
<html lang="en">

<head>

   
<meta charset="UTF-8">


   
<style>
@import url("https://fonts.googleapis.com/css2?family=Raleway:wght@400;500;700&display=swap");
        body
{
           
font-family: 'Raleway', sans-serif;
           
font-size: 15px;
       
}

       
.search-names {
           
padding: 1em 2em;
           
width: 250px;
           
background: #eee;
           
display: inline-block;
           
margin: auto;
           
line-height: 1.6;
       
}
       
.search-names h3 {
           
margin-bottom: 0;
       
}
       
.search-names a {
           
color: #1da1f2;
       
}

       
.form-element {
           
max-width: 900px;
           
margin: auto;
           
margin-top: 4em;
       
}
       
.form-element input {
           
width: calc(100% - 19px);
           
height: 45px;
           
border: none;
           
border-bottom: 1px solid #222;
           
outline: none;
           
margin: 0;
           
padding-left: 18px;
           
font-size: 40px;
           
padding-bottom: 0.4em;
       
}

       
.query-filter {
           
position: relative;
       
}

       
.auto-complete {
           
position: absolute;
           
top: 100%;
           
width: 100%;
           
background: #fff;
       
}
       
.auto-complete__options {
           
display: none;
           
border: 1px solid #ddd;
           
padding: 1.6em 18px;
           
margin: 0;
           
list-style-type: none;
       
}
       
.auto-complete__options li {
           
margin-bottom: 1.5em;
           
font-size: 1.1em;
       
}
       
.auto-complete__options li:last-of-type {
           
margin-bottom: 0;
       
}

       
.form-element.active .auto-complete__options {
           
display: block;
       
}
   
</style>


</head>

<body translate="no">
   

   
<div class="form-element">
       
<form action="" autocomplete="off">
           
<div class="query-filter">
               
<input type="text" name="" id="search" placeholder="Search names">
               
<div class="auto-complete">
                   
<ul class="auto-complete__options">
                   
</ul>
               
</div>
           
</div>
       
</form>
   
</div>

   
<script type="text/javascript" src="//repo.bfw.wiki/bfwrepo/js/fuse.min.js"></script>
   
<script>
       
const searchInput = document.querySelector('#search');
       
const resultParent = document.querySelector('.auto-complete__options');
       
const formParent = document.querySelector('.form-element');
        let searchOptions
= ["kenny", "kenneth", "ramey", "dakota", "kayden", "thor", "caroline", "shadow", "jelly"];


       
const fuse = new Fuse(searchOptions, {
            threshold
: 0.2
       
});

       
const updateResults = event => {
            let list
= '';
           
const inputField = event.currentTarget;
           
const searchResults = fuse.search(inputField.value);

           
// toggle auto complete dropdown
           
if (inputField.value.length > 0) {
                formParent
.classList.add('active');
           
} else {
                formParent
.classList.remove('active');
           
}

           
if (searchResults.length > 0) {
                searchResults
.map(listItem => list += `<li>${listItem.item}</li>`);
           
} else {
                list
= "No results found";
           
}

            resultParent
.innerHTML = list;

       
};


        searchInput
.addEventListener('keyup', event => updateResults(event));

   
</script>



</body>

</html>



立即下载fuse.min.js查看所有js插件

网友评论0

程序员在线工具箱