javascript技巧

关注公众号 jb51net

关闭
首页 > 网络编程 > JavaScript > javascript技巧 > 模糊搜索库Fuse.js用法

强大、轻巧、零依赖的模糊搜索库Fuse.js用法实例

作者:一行注释

Fuse.js是一款轻量级的JavaScript模糊搜索库,提供了模糊搜索和搜索排序功能,这篇文章主要介绍了强大、轻巧、零依赖的模糊搜索库Fuse.js用法的相关资料,需要的朋友可以参考下

什么是 Fuse.js?

Fuse.js 是一个轻量级的 JavaScript 模糊搜索库。它允许你在一组数据(如数组中的对象)中进行灵活的搜索,即使搜索词与目标数据不完全匹配,也能找到相关的结果。这在构建具有搜索功能的应用程序(如网站的搜索栏、应用内的数据搜索等)时非常有用。

基本用法

安装:

你可以通过 npm 安装 Fuse.js。在你的项目目录下,在终端中运行命令来安装。如果是在浏览器环境中使用,也可以直接从 CDN 引入脚本文件,例如<script src="https://unpkg.com/fuse - js@6.4.6/dist/fuse.min.js"></script>(这里的版本号可能需要根据实际情况更新)。

npm install fuse.js
yarn add fuse.js
//ES6模块语法:
import Fuse from 'fuse.js'

//CommonJS:
const Fuse = require('fuse.js')

创建 Fuse 实例:

首先,需要准备好要进行搜索的数据。假设你有一个数组list,里面包含一些对象,每个对象有namedescription属性。例如:

       const list = [
         {
           name: "Apple",
           description: "A round and sweet fruit"
         },
         {
           name: "Banana",
           description: "A long and curved fruit"
         },
         {
           name: "Cherry",
           description: "A small and red fruit"
         }
       ];

然后,创建一个 Fuse 实例。你需要传入数据和一个配置对象。配置对象可以设置搜索的各种参数,如搜索的键(keys)、匹配程度(threshold)等。例如:

       const fuse = new Fuse(list, {
         keys: ["name", "description"]
       });

在这个例子中,keys属性指定了要在namedescription这两个属性中进行搜索。

进行搜索:

使用search方法来执行搜索。例如,如果你想搜索包含 “fruit” 这个词的项目,可以这样做:

       const results = fuse.search("fruit");
       console.log(results);

results将会是一个包含匹配结果的数组。每个结果对象包含一些信息,如item(匹配的原始数据项)、refIndex(在原始数据中的索引)和score(匹配程度的分数)。

配置选项详解

keys

如前面例子所示,keys是一个数组,用于指定在数据对象的哪些属性中进行搜索。你可以根据实际数据结构灵活设置。例如,如果你的数据对象还有category属性,并且也想对其进行搜索,可以将category添加到keys数组中。

threshold

这个参数用于设置匹配的阈值,范围是 0 到 1。默认值是 0.6。阈值越低,匹配的要求就越宽松。例如,设置threshold: 0.3会使搜索结果包含更多相关性稍弱的项目。

ignoreLocation

这是一个布尔值,默认是false。当设置为true时,搜索时不考虑关键词在文本中的位置,这在某些情况下可能会增加搜索的灵活性。

高级用法

自定义匹配算法:

Fuse.js 允许你自定义匹配算法。你可以通过实现一个自定义的matcher函数来达到这个目的。这个函数接受两个参数:text(要搜索的文本)和term(搜索词),并返回一个匹配程度的分数。例如:

       const customMatcher = (text, term) => {
         // 自定义的匹配逻辑
         // 这里只是一个简单示例,返回一个固定分数
         return 0.5;
       };
       const fuse = new Fuse(list, {
         keys: ["name", "description"],
         matcher: customMatcher
       });

处理异步数据:

如果你的数据是通过异步请求获取的(如从 API 获取数据),你需要先等待数据加载完成,然后再创建 Fuse 实例并进行搜索。例如,使用async/await语法:

       async function searchAsyncData() {
         const response = await fetch('your - api - url');
         const data = await response.json();
         const fuse = new Fuse(data, {
           keys: ["name", "description"]
         });
         const results = fuse.search("your - search - term");
         console.log(results);
       }
       searchAsyncData();

以下是 Fuse.js 的一些高级用法:

自定义权重:

你可以为不同的搜索键设置不同的权重,以便某些键的匹配对最终结果的得分产生更大的影响。例如,在一个包含titlecontent的文档列表中,你可能希望title的匹配权重更高,因为标题通常更重要。

    const options = {
        keys: [
            { name: 'title', weight: 0.7 },
            { name: 'content', weight: 0.3 }
        ]
    };
    const fuse = new Fuse(list, options);

使用过滤器:

除了搜索键之外,你可以添加过滤器来进一步筛选结果。假设你有一个包含文章的列表,并且这些文章有一个category属性,你可以添加一个过滤器只返回属于特定类别文章的搜索结果。

    const options = {
        keys: ['title', 'content'],
        filter: (item) => item.category === 'technology'
    };
    const fuse = new Fuse(list, options);

模糊匹配选项:

Fuse.js 允许你调整模糊匹配的具体设置,包括距离和字符匹配。例如,你可以调整模糊匹配的最大编辑距离(允许多少字符的差异)和字符匹配的规则。

    const options = {
        keys: ['title', 'content'],
        distance: 100,  // 最大编辑距离
        includeMatches: true,  // 包含匹配的详细信息
        findAllMatches: true,  // 找到所有可能的匹配
        minMatchCharLength: 3  // 匹配字符的最小长度
    };
    const fuse = new Fuse(list, options);

自定义排序函数:

你可以使用自定义排序函数对搜索结果进行排序,而不是依赖于默认的得分排序。

    const options = {
        keys: ['title', 'content'],
        sortFn: (a, b) => {
            if (a.item.date > b.item.date) {
                return -1;
            } else if (a.item.date < b.item.date) {
                return 1;
            }
            return 0;
        }
    };
    const fuse = new Fuse(list, options);

搜索结果的分页:

对于大量的搜索结果,你可能需要分页显示。可以使用search方法的limitoffset参数来实现。

    const options = {
        keys: ['title', 'content']
    };
    const fuse = new Fuse(list, options);
    const results = fuse.search('search term', { limit: 10, offset: 20 });

使用自定义匹配函数:

除了使用内置的匹配函数,你可以实现一个完全自定义的匹配函数。

    const options = {
        keys: ['title', 'content'],
        getFn: (obj, path) => {
            // 自定义的获取属性值的函数
            if (path === 'customKey') {
                return obj.customKey.toUpperCase();
            }
            return Fuse.config.getFn(obj, path);
        },
        matchAllTokens: false,  // 是否匹配所有搜索词
        shouldSort: false,  // 是否排序结果
        tokenSeparator: /\s+/  // 分词分隔符
    };
    const fuse = new Fuse(list, options);

参考文档地址fusejs文档

总结

到此这篇关于强大、轻巧、零依赖的模糊搜索库Fuse.js用法的文章就介绍到这了,更多相关模糊搜索库Fuse.js用法内容请搜索脚本之家以前的文章或继续浏览下面的相关文章希望大家以后多多支持脚本之家!

您可能感兴趣的文章:
阅读全文