fuse.js 索引使用

fuse.js 中对于索引能力的说明和示例相对简单。主要使用到3个函数:

  • Fuse.createIndex()
  • Fuse.parseIndex()
  • FuseIndex.prototype.toJSON()

具体示例也粘贴过来

javascript 复制代码
const books = [
  {
    "title": "Old Man's War",
    "author": {
      "firstName": "John",
      "lastName": "Scalzi"
    }
  },
  {
    "title": "The Lock Artist",
    "author": {
      "firstName": "Steve",
      "lastName": "Hamilton"
    }
  }
  /*...*/
]

// 示例 Part1
// 创建 `FuseIndex` 索引对象
const myIndex = Fuse.createIndex(['title', 'author.firstName'], books)
// 调用 `toJSON()` 方法得到索引对象的 JSON 对象,并将其写到 `fuse-index.json` 文件中
fs.writeFile('fuse-index.json', JSON.stringify(myIndex.toJSON()))

// 示例 Part2
// 从文件 `fuse-index.json` 中读取之前存储的 JSON 对象
const fuseIndex = await require('fuse-index.json')
// 将 JSON 对象重新解析生成一个 `FuseIndex` 索引对象
const myIndex = Fuse.parseIndex(fuseIndex)
// 使用索引对象创建
const fuse = new Fuse(books, options, myIndex)

示例简单,但是在业务中使用场景会很复杂,比如:

  1. 需要搜索的数据很多,也就是 books.length 可能会比较大,有时不可能一次性读取全量 books 数据。
  2. books 的数据是异步读取的,比如通过请求接口、读取本地文件的方式获取。

如果 books 数据不可能全部获取,那创建 Fuse 实例时是否可以不传入 books

javascript 复制代码
const fuse = new Fuse([], options, myIndex)

用该实例搜索后发现返回结果中缺少 item,也就是对应的 book 数据,但搜索结果中的匹配信息仍旧存在。

javascript 复制代码
// 搜索 'Lock' 关键字并获得结果
const result = fuse.search('Lock')

result 对下如下:

JSON 复制代码
[
  {
    "refIndex": 1,
    "matches": [
      { "indices": [[4, 7]], "value": "The Lock Artist", "key": "title" }
    ],
    "score": 0.15609486447437038
  }
]

对比正常情况下的搜索结果如下:

JSON 复制代码
[
  {
    "item": {
      "title": "The Lock Artist",
      "author": { "firstName": "Steve", "lastName": "Hamilton" }
    },
    "refIndex": 1,
    "matches": [
      { "indices": [[4, 7]], "value": "The Lock Artist", "key": "title" }
    ],
    "score": 0.15609486447437038
  }
]

此时有一个疑问,如果不是传入空数组,而是传入一个和之前毫不相关的 books 数据,会发生什么? 尝试传入 books.reverse()

javascript 复制代码
const fuse = new Fuse(books.reverse(), options, myIndex)

此时再搜索的话,得到结果:

JSON 复制代码
[
  {
    "item": {
      "title": "Old Man's War",
      "author": { "firstName": "John", "lastName": "Scalzi" }
    },
    "refIndex": 1,
    "matches": [
      { "indices": [[4, 7]], "value": "The Lock Artist", "key": "title" }
    ],
    "score": 0.15609486447437038
  }
]

其实可以猜测,索引对象是通过数组下标的形式关联对应的 book 数据,看起来可能返回结果中的 refIndex 就是对应的下标。

在此基础上,我们可以来解决之前遇到的问题:在创建 Fuse 实例时,无需传入 books 数据(或者只传入类似于 [{ id: '123' }, { id: '456' }] 这种数据),而只需要索引文件,仍旧可以完成搜索,并且使用 refIndex 或者其他搜索结果中的数据来进一步获取更详细的数据。

相关推荐
leafyyuki7 分钟前
前端 SSE 流式请求实战:打造流畅的 AI 流式应答体验
前端·人工智能·markdown
幸福指北15 分钟前
我用 Tauri + Vue 3 + Rust 开发了一款跨平台网络连接监控工具Portview,性能炸裂!
前端·网络·vue.js·tcp/ip·rust
炁场悟道16 分钟前
基于vue3的极简登录架构设计
前端
光影少年19 分钟前
Webpack的核心概念?常见优化手段?
前端·webpack·掘金·金石计划
han_20 分钟前
前端性能优化之白屏、卡顿指标和网络环境采集篇
前端·javascript·性能优化
Flyfreelylss29 分钟前
DOM 注入实践:在 React 中优雅地扩展第三方组件
前端·react.js
北城笑笑38 分钟前
Vue 100 ,Metaspace memory lack Error( 元空间内存不足 )
java·前端·javascript·vue
谏书稀38 分钟前
vue项目(pnpm)迁移到无网环境开发
前端·javascript·vue.js
Han.miracle43 分钟前
Spring IoC 与 DI 核心知识点综合测试题
java·前端·数据库
im_AMBER1 小时前
react-i18next 国际化支持
前端·react.js·前端框架