【发布时间】:2014-12-11 05:43:12
【问题描述】:
从数据结构的角度来看,Lucene 如何过滤一系列连续值?
我了解 Lucene 依赖于类似于 CONCISE 的压缩位数组数据结构。从概念上讲,这个位数组为每个不匹配术语的文档保存一个 0,为每个匹配一个术语的文档保存一个 1。但是很酷/很棒的部分是这个数组可以被高度压缩并且在布尔运算中非常快。例如,如果您想知道哪些文档包含术语“red”和“blue”,那么您获取对应于“red”的位数组和对应于“blue”的位数组,并将它们相加得到对应于的位数组匹配文件。
但是 Lucene 还提供了对连续值范围的非常快速的查找,如果 Lucene 仍然使用这种相同的压缩位数组方法,我不明白这在计算或内存中是如何有效地发生的。这是我的假设,你告诉我我有多接近:Lucene 离散化连续字段并为每个这些(现在是离散的)值创建一个位数组。然后,当您想要一个跨值的范围时,您可以获取与该范围相对应的位数组,然后将它们组合在一起。由于我怀疑会有大量的数组来 AND 一起,那么也许您可以在多个粒度级别上执行此操作,以便您可以尽可能地将大块 AND 一起。
更新: 哦!我刚刚意识到另一种更快的选择。既然我们知道上面提到的离散化范围的位数组不会重叠,那么我们可以顺序存储位数组。如果我们的范围有一个开始值和结束值,那么我们可以在这个位数组的 array 中保留一个对应点的索引。此时,我们只需跳入位数组数组并开始扫描它,就好像我们正在扫描单个位数组一样。我接近了吗?
【问题讨论】:
-
提示:一些排序是通过 FieldCache 完成的,它是索引的未倒置视图。另请参阅 DocValues。
-
有没有机会this 回答你的问题?
-
@mindas - 谢谢,这肯定让我更接近
标签: data-structures solr lucene elasticsearch