我想在我的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是映射document到position的地图--例如单词2在1号文件的位置1,在第2、43和1246位置的第2号文档中。
我想要添加到数据库中的每一个新文档都只是一个带有word id的数组:
[23, 43, 75, 18, ... ]所以使用spring-mongo,我有一个java代码:
for (int i=0; i < array.length; i++) {
invertedListDao.upsert(array[i], documentId, i);
}(upsert方法是由我实现的)
这个解决方案是可行的,但是如果文档有10万字,那么mongo需要100000个查询。
最后,我的问题是:塞拉是否能更快地做到这一点?一次查询整个数组,然后在db中执行?我知道eval函数存在于mongo中,但在mongo-spring中却没有
发布于 2015-04-06 07:46:07
提高性能的一种方法是使用散装鞋帮。
var bulk = db.invertedListDao.initializeUnorderedBulkOp();
for (var i=0; i < array.length; i++){
bulk.find({...}).upsert().replaceOne({...})
}
bulk.execute();它更有效率的原因,以及你可以预期的速度提升,都在我在这里的回答中概述了,但是基本上,不管你有多少单词,你只会做,只调用1次。
我不熟悉java spring,但我的基本搜索表明它是支持的和我希望您能够找到如何在您的java驱动程序中实现批量上服务器。
P.S.,在Bartektartanus的帮助下,这里是链接到正式文件。
https://stackoverflow.com/questions/29433756
复制相似问题