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 或者其他搜索结果中的数据来进一步获取更详细的数据。

相关推荐
步行cgn1 分钟前
为什么既要 web.xml 又要 springmvc.xml?能不能只配一个?
xml·前端·hive
风骏时光牛马8 分钟前
大模型综合能力评测:多维度性能与对齐效果对比
前端
winfredzhang14 分钟前
从零手写一个毛玻璃风格的页面搭建台:单文件 HTML 实现组件放置、面板磁吸与图层管理
前端·html
葡萄城技术团队9 小时前
1000 人协同压测的环境瓶颈排查:CPU 争用与 Wi\-Fi
前端
excel10 小时前
Marked 与 Markdown 有什么区别?该怎么选?
前端
Da Da 泓11 小时前
五子棋 Web 端测试用例报告
前端·网络·websocket·网络协议·测试用例·项目
zxcvb15311 小时前
远程查看本地文档:一条轻量 Web 文件服务的工程化链路
前端·远程查看文档
niucloud-admin11 小时前
NIUCLOUD PHP SAAS上门家政使用文档:城市管理
java·前端·php
北岛贰12 小时前
啵啵音乐迎来全新升级!
前端
hkNaruto14 小时前
【AI】基于大模型的AI游戏地图生成、控制方案:AI Native Game Harness 迁移操作手册
前端·人工智能·游戏