gpt4 book ai didi

data-structures - Lucene 如何过滤一系列连续值

转载 作者:行者123 更新时间:2023-12-02 22:16:06 26 4
gpt4 key购买 nike

从数据结构的角度来看,Lucene 如何过滤一系列连续值?

据我所知,Lucene 依赖于类似于 CONCISE 的压缩位数组数据结构。 。从概念上讲,该位数组为每个与术语不匹配的文档保存 0,为每个与术语匹配的文档保存 1。但最酷/很棒的部分是这个数组可以高度压缩并且 bool 运算速度非常快。例如,如果您想知道哪些文档包含术语“红色”和“蓝色”,那么您可以获取与“红色”对应的位数组和与“蓝色”对应的位数组,并将它们与在一起以获得与匹配文件。

但是 Lucene 还提供了对连续值范围的非常快速的查找,如果 Lucene 仍然使用相同的压缩位数组方法,我不明白这是如何在计算或内存中有效发生的。这是我的假设,你告诉我我有多接近:Lucene 离散化连续字段并为每个(现在是离散的)值创建一个位数组。然后,当您想要一个跨值范围时,您可以获取与该范围相对应的位数组,然后将它们“与”在一起。因为我怀疑会有大量的数组需要“与”在一起,那么也许您可以在多个粒度级别上执行此操作,以便可以尽可能地将大块“与”在一起。

更新:哦!我刚刚意识到另一种更快的选择。由于我们知道上述离散化范围的位数组不会重叠,因此我们可以顺序存储位数组。如果我们有范围的起始值和结束值,那么我们可以在这个位数组数组中保留相应点的索引。此时,我们只需跳入位数组数组并开始扫描它,就好像我们正在扫描单个位数组一样。我很接近吗?

最佳答案

范围查询(例如 0 到 100)是范围内所有术语(1、2、3、4、5...)的列表的并集。问题是,如果范围必须访问许多术语,因为这意味着处理许多短期列表。

最好只处理几个长列表(这是 lucene 优化的目的)。因此,当您使用数字字段并对数字(如 4)进行索引时,我们实际上会对其进行多次冗余索引,以较低的精度添加一些“假项”。这允许我们通过处理 7 个术语而不是 100 来处理 0 到 100 之类的范围:“0-63”、“64-95”、96、97、98、99、100。在此示例中“0-63” "和 "64-95"是表示值范围的附加冗余术语。

关于data-structures - Lucene 如何过滤一系列连续值,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/26394546/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com