我正在尝试创建一个lunr索引,并且能够在分配后为其添加文档。这是我正在尝试做的稍微简化的版本:
var documents = [{
'id': '1',
'content': 'hello'
}, {
'id': '2',
'content': 'world'
}, {
'id': '3',
'content': '!'
}];
var idx = lunr(function() {
this.ref('id');
this.field('content');
});
for (var i = 0; i < documents.length; ++i) {
idx.add(documents[i]);
}
这给了我以下错误:TypeError:idx.add不是函数。 我见过多个tutorials说这就是你应该怎么做的。
如果我在分配idx时添加文件,它只对我有用;
var documents = [{
'id': '1',
'content': 'hello'
}, {
'id': '2',
'content': 'world'
}, {
'id': '3',
'content': '!'
}];
var idx = lunr(function() {
this.ref('id');
this.field('content');
for (var i = 0; i < documents.length; ++i) {
this.add(documents[i]);
}
});
我仍然是一个javascript noob所以这可能与lunr无关。
答案 0 :(得分:7)
您链接的教程适用于较早版本的Lunr。最新版本要求您在传递给lunr
函数的函数中将所有文档添加到索引中。换句话说,你的第二个例子对于最新版本的Lunr是正确的。
有一个guide升级到最新版本,希望能够涵盖旧版本(和其他)教程与最新版本之间的差异。
答案 1 :(得分:0)
我也有同样的错误,您必须使用旧的v1.0.0来实现。
v1.0
`var idx = lunr(function () {
this.ref('id')
this.field('text')
})
// somewhere else, when you received 1 json from a stream.
oboe().node('features.*', function( ___feature___ ){
idx.add( one-node-json)
)}
`
v2.x您不能这样做,在2.x版本中,文档是在配置功能结束之前添加的
`var idx = lunr(function () {
this.ref('id')
this.field('text')
// at this moment you have to have whole json, not work with oboe stream json
// when stream json, only 1 node received at a time, you do not have whole-json yet
//until you reach stream end
this.add( whole-json)
})`
为避免将整个1GB的json存储在内存中,我选择了oboe来流式传输json,这意味着一次只能发出1个json,我只能使用v1.x将此一个json添加到idx。
v2.x,我必须一个接一个地存储这1个json直到结束,在内存中最多添加1 GB,那时,我可以将整个1GB json添加到idx,而不是因为许多用户的浏览器将以1GB的内存崩溃。
但是v1.x可以工作,因为它使用更少的内存,一次只添加1个json。