版本迁移

英文原地址

Lunr 2.x 版本与之前的版本接口和之前相似,因此升级后的搜索的执行方式不会有太大变化。索引的构建和序列化方式以及管道韩式所需的接口都有所不同。本文将介绍二者的差异并说明如何升级。

索引构建

0.x/1.x 版本与 2.x 版本的最大区别是 Lunr 索引现在是不可变的(immutable)。一旦构建了它们,就不可能在索引中添加、更新或删除任何文档。必须在定义函数退出前添加所有文档。

0.x/1.x 版本是按照下面的方法添加索引的:

var idx = lunr(function () {
  this.ref('id')
  this.field('text')
})

idx.add({ id: 1, text: 'hello' })
1
2
3
4
5
6

而在 2.x 中,文档是在配置函数的末尾添加的:

var idx = lunr(function () {
  this.ref('id')
  this.field('text')

  this.add({ id: 1, text: 'hello' })
})
1
2
3
4
5
6

搜索

搜索接口向后兼容之前版本的 Lunr。0.x/1.x 中的搜索方法在 2.x 中依然试用。

搜索的行为发生了轻微的改变,多关键词搜索现在采用逻辑或OR,之前是逻辑和AND

实际上,这一变化意味着在 2.x 中给定的搜索将返回比以前更多的文档,并且最先返回最相关的结果。

管道函数

在旧版本中,管道函数的接口非常简单;关键词就是字符串。在 2.x 版本中,关键词以lunr.Token表示。

举例来说,假设有一个管道函数将关键词转换为小写。之前的版本可以这样实现:

var downcaser = function (token) {
  return token.toLowerCase()
}
1
2
3

在 2.x 版本稍微复杂一点点:

var downcaser = function (token) {
  return token.update(function (str) {
    return str.toLowerCase()
  })
}
1
2
3
4
5

更多细节请参见 API 文档中的 new lunr.Token 对象。