可以全面更新其全文索引而无需完整的重新索引吗?

时间:2014-03-20 09:06:37

标签: javascript full-text-search

我正在评估fullproof javascript全文搜索引擎,但我无法弄清楚它是否可以处理索引更新。从我对api的阅读中,我没有看到更新或删除索引中的内容。

例如,

lunr.js可以在没有完整的重新索引的情况下对索引进行updates

我希望它可以进行索引更新,因为在我的iPad上,创建索引需要10分钟,如果必须每次都重建索引,那就太高了。相比于创造lunrjs指数的40秒。但是,lunr的问题在于完整索引需要在内存中,而在完全防范中,它将索引放在本地WebSQL数据库中。

2 个答案:

答案 0 :(得分:1)

我不能说完全,但没有什么能阻止你自己将lunr索引快照到客户端存储中。

给出以下索引:

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

您可以将其转储为JSON,如下所示:

var dump = JSON.stringify(idx)

现在您可以将转储存储在您喜欢的任何地方,我对WebSQL并不过分熟悉,但将其存储在localStorage中可能如下所示:

localStorage.setItem('lunr_dump', dump)

要重新加载索引,请执行以下操作:

var idx = lunr.Index.load(dump)

将转储索引加载到lunr应该比每次重建索引快几个数量级。

正如您所提到的,lunr每次都不需要重新构建整个索引,因此我们假设您更新了一个文档,并希望保持转储版本的最新状态:

idx.on('update', function (doc, index) {
  localStorage.setItem('lunr_dump', JSON.stringify(index))
})

idx.update(someDocument)

这将再次转储整个索引,包括更新时所做的任何更改。值得对转储进行基准测试,因为可能存在一些开销,尤其是索引较大。

如果您的数据是相对静态的,您实际上可以在服务器上预先构建索引并将其发送到客户端,从而为客户端保存在每个页面加载时构建索引的工作,请查看https://github.com/olivernn/lunr-index-builder

你可以稍微进一步,因为转储的索引只是JSON,没有什么能阻止你单独索引文档然后将转储的索引合并在一起,这里有一个issue有一些讨论和一个如果您有兴趣,可以链接到关于实施它的博客文章。

答案 1 :(得分:0)

由于缺少对此github issue的评论,看起来fullproof无法更新/删除其索引中的项目。

相关问题