赋值后无法将文档添加到lunr索引(TypeError:idx.add不是函数)

时间:2017-05-18 14:20:53

标签: javascript lunrjs

我正在尝试创建一个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无关。

2 个答案:

答案 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。

I have ask author to solve this in future

v1 v2 difference