有 Java 编程相关的问题?

你可以在下面搜索框中键入要查询的问题!

java在Mongo中构建倒排列表的更快方法

我想在我的MongoDB集合中构建反向列表。 集合如下所示:

{ "word" : 2, "docToPos" : { "1" : [ 0 ] } }
{ "word" : 5, "docToPos" : { "1" : [ 1 ] } }
{ "word" : 1, "docToPos" : { "1" : [ 2 ], "2" : [ 1 ] } }
{ "word" : 9, "docToPos" : { "2" : [ 2, 43, 1246 ] } }

word是字典中的某个id,docToPos是映射documentposition-例如单词2在文档1中的位置1,单词9在文档2中的位置2、43和1246

我想添加到数据库中的每个新文档都只是一个具有word id的数组:

[23, 43, 75, 18, ... ]

因此,使用spring mongo,我有以下java代码:

for (int i=0; i < array.length; i++) {
  invertedListDao.upsert(array[i], documentId, i);
}

(upsert方法由我来实现)

此解决方案可行,但若文档有100000个单词,则需要100000个查询才能访问mongo

所以最后,我的问题是:thera是一种更快的方法吗?一次查询整个数组并在db中执行?我知道在mongo中有eval函数,但在mongo-spring中没有


共 (1) 个答案

  1. # 1 楼答案

    提高性能的一种方法是使用bulk upserts

    var bulk = db.invertedListDao.initializeUnorderedBulkOp();
    for (var i=0; i < array.length; i++){
      bulk.find({...}).upsert().replaceOne({...})
    }
    bulk.execute();
    

    效率更高的原因以及您可以期望的速度提升在my answer here中进行了概述,但基本上,无论您有多少单词,您只需要给mongo打一个电话

    我不熟悉JavaSpringMongo,但是我的基本搜索suggests that it is supported,我希望您能够找到如何在java驱动程序中实现批量升级

    p.S.在巴特卡塔努斯的帮助下,这里是link to official documentation