预构建索引

英文原地址

对于大量的文档,Lunr 需要花费时间来建立索引。建立索引所花费的时间会导致浏览器阻塞,从而降低用户体验。

更好的方法是预先构建索引,并提供一个序列化的索引,Lunr 可以更快地在客户端加载该索引。

这种技术对于大量索引或静态文档(比如静态网站)非常有用。

序列化

lunr 索引支持 JSON 序列化。假设已经创建了索引,您可以使用内置的 JSON 对象进行序列化:

  1. var serializedIdx = JSON.stringify(idx)

然后,我们可以将这个序列化的索引写入文件、压缩并与其他静态资源一同提供。

下面的示例是一个可用于构建序列化索引的脚本。它假设文档在标准输入流(STDIN)中为可用的 JSON 格式,并且具有titlebody字段以及用于引用的id

  1. var lunr = require('lunr'),
  2. stdin = process.stdin,
  3. stdout = process.stdout,
  4. buffer = []
  5. stdin.resume()
  6. stdin.setEncoding('utf8')
  7. stdin.on('data', function (data) {
  8. buffer.push(data)
  9. })
  10. stdin.on('end', function () {
  11. var documents = JSON.parse(buffer.join(''))
  12. var idx = lunr(function () {
  13. this.ref('id')
  14. this.field('title')
  15. this.field('body')
  16. documents.forEach(function (doc) {
  17. this.add(doc)
  18. }, this)
  19. })
  20. stdout.write(JSON.stringify(idx))
  21. })

假设上面的脚本在当前目录下一个名为build-index.js的文件中,我们可以使用它从标准输入流中创建一个 JSON 序列化的索引:

  1. $ echo '[{ "id": "1", "title": "Foo", "body": "Bar" }]' | node build-index.js > index.json

加载

加载一个序列化索引要比从头构建索引快得多。假设一个名为data的变量包含了序列化索引,那么我们这样加载:

  1. var idx = lunr.Index.load(JSON.parse(data))