Building Lunr Indexes
For large numbers of documents, it can take time for Lunr to build an index. The time taken to build the index can lead a browser to block; making your site seem unresponsive.
A better way is to pre-build the index, and serve a serialised index that Lunr can load on the client side much quicker.
This technique is useful with large indexes, or with documents that are largely static, such as with a static website.
Serialization
Lunr indexes support serialisation in JSON. Assuming that the index has already been created, it be serialised using the built-in JSON object:
import 'dart:convert';
//...
String serializedIdx = json.encode(idx);
This serialized index can then be written to a file, compressed, and served along side other static assets.
Assuming the following sample.json
:
[{ "id": "1", "title": "Foo", "body": "Bar" }]
This can converted to a saved index in json index.json
as follows:
import 'dart:io';
import 'package:lunr/lunr.dart';
void main() {
dynamic json = json.decode(File('sample.json').readAsStringSync());
Index idx = lunr((builder) {
builder.ref = 'id';
builder.field('title');
builder.field('body');
for(dynamic doc in json) {
builder.add(doc);
}
})
File('index.json').writeAsStringSync(json.encode(idx));
}
Loading
Loading a serialised index is significantly quicker than building the index from scratch. Assuming a variable named data contains the serialised index, loading the index is done like this:
import 'dart:io';
import 'package:lunr/lunr.dart';
void main() {
dynamic json = json.decode(File('index.json').readAsStringSync());
var idx = Index.load(json);
}
Now we have shown how to save and reload an index, lets move to customizing our index