我对Scala很新,所以请原谅我的无知!我正在尝试迭代以最大值为界的整数对.例如,如果最大值为5,则迭代应返回:
(0, 0), (0, 1), ..., (0, 5), (1, 0), ..., (5, 5)
Run Code Online (Sandbox Code Playgroud)
我选择尝试并以递归方式将其作为Stream返回:
@tailrec
def _pairs(i: Int, j: Int, maximum: Int): Stream[(Int, Int)] = {
if (i == maximum && j == maximum) Stream.empty
else if (j == maximum) (i, j) #:: _pairs(i + 1, 0, maximum)
else (i, j) #:: _pairs(i, j + 1, maximum)
}
Run Code Online (Sandbox Code Playgroud)
没有tailrec注释,代码可以工作:
scala> _pairs(0, 0, 5).take(11)
res16: scala.collection.immutable.Stream[(Int, Int)] = Stream((0,0), ?)
scala> _pairs(0, 0, 5).take(11).toList
res17: List[(Int, Int)] = List((0,0), (0,1), (0,2), …Run Code Online (Sandbox Code Playgroud) 在MongoDB中,给定find()运算符返回一组行的游标,这是一种惯用且省时的方式来返回“上下文”行,即按顺序在该组中的每一行之前和/或之后的行?
对我来说,最简单的解释这个概念的方法是使用ack,它支持上下文搜索。给定一个文件:
line 1
line 2
line 3
line 4
line 5
line 6
line 7
line 8
Run Code Online (Sandbox Code Playgroud)
这是ack的输出:
C:\temp>ack.pl -C 2 "line 4" test.txt
line 2
line 3
line 4
line 5
line 6
Run Code Online (Sandbox Code Playgroud)
我将日志数据存储在MongoDB集合中,每行一个文档。每个日志都将每个标记化为关键字,并对这些关键字进行索引,这使我获得了便宜的全文搜索。
我执行一个沼泽标准:
collection.find({keywords: {'$all': ['key1', 'key2']}}, {}).sort({datetime: -1});
Run Code Online (Sandbox Code Playgroud)
并得到一个光标。在此阶段,不添加任何其他字段,获取上下文的方法是什么?我认为流程是这样的:
对于具有R行的结果集,这需要2R + 1查询。
但是,我认为我可以权衡时间。是否可行的替代方案是在后台用上下文_id更新每一行?对于当前具有字段的给定行:
_id, contents, keywords
Run Code Online (Sandbox Code Playgroud)
我会添加一个附加字段:
_id, contents, keywords, context_ids
Run Code Online (Sandbox Code Playgroud)
然后我可以在随后的搜索中以某种方式使用这些context_ids吗?我对MongoDB MapReduce完全不熟悉,但是那也可以出现吗?
我认为最直接的方法是将实际上下文行的全文存储在每一行中,但这对我来说似乎有点粗糙。明显的优势是,单个查询可以返回我需要的上下文。
我感谢接受问题范围的所有答案。我意识到我可以带外使用Lucene或真正的全文本搜索引擎,但是我想体验一下MongoDB的优势和功能,所以我希望能得到MongoDB特定的答案。谢谢!