lucene如何索引文档?

2024-01-01

我读了一些关于Lucene的文档;我还阅读了此链接中的文档 (http://lucene.sourceforge.net/talks/pisa http://lucene.sourceforge.net/talks/pisa).

我不太明白Lucene是如何索引文档的,也不明白Lucene使用哪些算法来索引?

在上面的链接中,它说 Lucene 使用此算法进行索引:

  • incremental algorithm:
    • 维护一个段索引堆栈
    • 为每个传入文档创建索引
    • 将新索引压入堆栈
    • 设 b=10 为合并因子;中号=8

for (size = 1; size < M; size *= b) {
    if (there are b indexes with size docs on top of the stack) {
        pop them off the stack;
        merge them into a single index;
        push the merged index onto the stack;
    } else {
        break;
    }
}

该算法如何提供优化的索引?

Lucene使用B树算法还是任何其他类似的算法来建立索引 - 或者它有特定的算法吗?


简而言之,Lucene 使用以下方式构建倒排索引:跳过列表 https://lucene.apache.org/core/6_6_0/core/org/apache/lucene/codecs/MultiLevelSkipListWriter.html on disk,然后加载索引项的映射进入记忆用一个有限状态换能器 https://lucene.apache.org/core/6_6_0/core/org/apache/lucene/util/fst/Builder.html(FST)。但请注意,Lucene不(必须)将所有索引项加载到 RAM http://blog.mikemccandless.com/2010/07/lucenes-ram-usage-for-searching.html正如 Lucene 索引系统的作者 Michael McCandless 本人所描述的那样。请注意,通过使用 Skip-Lists,索引可以从一个命中遍历到另一个命中,从而使得诸如set并且,特别是,范围查询可能(很像 B 树)。还有关于索引跳跃列表的维基百科条目 https://en.wikipedia.org/wiki/Skip_list#Indexable_skiplist还解释了为什么 Lucene 的 Skip-List 实现被称为多层次跳过列表 - 本质上,使O(log n)可以进行查找(同样,很像 B 树)。

因此,一旦倒排(术语)索引 - 基于跳表数据结构 https://en.wikipedia.org/wiki/Skip_list- 从文档构建,索引存储在磁盘上。 Lucene 然后将这些术语加载(如前所述:可能只是其中一些)到有限状态换能器 https://en.wikipedia.org/wiki/Finite-state_transducer,在 FST 实现中松散的灵感 https://lucene.apache.org/core/6_6_0/core/org/apache/lucene/util/fst/FST.html by 形态学 https://github.com/morfologik/morfologik-stemming.

迈克尔·麦坎德利斯(Michael McCandless)(也)在以下方面做得非常好和简洁解释 Lucene 如何以及为何使用(最小非循环)FST http://blog.mikemccandless.com/2010/12/using-finite-state-transducers-in.html为 Lucene 存储在内存中的术语建立索引,本质上是作为SortedMap<ByteSequence,SomeOutput>,并给出了 FST 如何工作的基本概念(即 FST 如何压缩字节序列 [即索引项] 以使该映射的内存使用量呈亚线性增长)。他指出描述特定 FST 算法的论文 http://citeseerx.ist.psu.edu/viewdoc/summary?doi=10.1.1.24.3698Lucene 也使用。

对于那些好奇为什么 Lucene 使用 Skip-Lists 而大多数数据库使用 (B+)- 和/或 (B)-Trees 的人,请看一下the right所以答案 https://stackoverflow.com/a/28270537/1847419关于这个问题(Skip-Lists vs. B-Trees)。这个答案给出了一个非常好的、深入的解释——本质上,not这么多使得索引的并发更新“更容易接受”(因为您可以决定不立即重新平衡 B 树,从而获得与 Skip-List 相同的并发性能),而是,跳过列表使您无需处理(延迟或不延迟)平衡操作(最终)B 树需要(事实上,正如答案所示/参考,如果其中任何一个“做得正确”,B 树和[多级]跳过列表之间的性能差异可能很小。)

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

lucene如何索引文档? 的相关文章

  • 依赖解析算法

    我正在编写一个包管理器 为此我希望依赖项解析尽可能强大 每个包都有一个版本列表 每个版本包含以下信息 具有可比性的 ID 依赖关系 软件包列表以及每个软件包的一组可接受的版本 冲突 软件包列表以及每个软件包的一组与该版本一起导致问题的版本
  • 在elasticsearch中转义特殊字符

    我正在使用Elasticsearch python 客户端 https elasticsearch py readthedocs io en master 对我们托管的 elasticsearch 实例进行一些查询 我注意到一些字符需要转义
  • 找到一个数是素数,为什么检查到n/2更好。避免n后半部分的数字的原因是什么

    要检查一个数是否是素数 最简单的方法是尝试将这个数除以 2 到 n 如果任何操作得到余数为 0 那么我们就说给定的数不是素数 但最好只进行划分和检查直到 n 2 我知道更好的方法是直到 sqrt n 我想知道跳过后半部分的原因 假设我们是否
  • 欧拉项目 45

    我还不是一名熟练的程序员 但我认为这是一个有趣的问题 我想我应该尝试一下 三角形 五边形 六边形 数字由以下生成 公式 三角形 T n n n 1 2 1 3 6 10 15 五边形 P n n 3n 1 2 1 5 12 22 35 六角
  • 使用 A 星查找路径的启发式函数

    I am trying to find a optimal solution for the following problem 每个节点内表示的数字表示为 x y 一个节点的相邻节点总是有一个y值为 当前节点 y 值 1 更改的成本为 1
  • 优先连接,Matlab 中的复杂网络

    大家好 我现在正在 MATLAB 中研究优先附件模型 在理解以下内容时遇到一些困难 假设我一开始有 4 个节点 连接如下 time 0 1 lt gt 2 3 lt gt 4 在下一个时间步骤中 我添加一个节点和 4 个连接 然后添加另一个
  • 如何衡量字符串的复杂度?

    我有一些长字符串 1 000 000 个字符 每个字符串仅包含定义字母表中的符号 例如 A 1 2 3 示例字符串 string S1 1111111111 meta complexity 0 string S2 1111222333 me
  • 如何为“%abc%”搜索创建文本索引?

    我想对查询进行索引x like abc 如果我有一个如下表 create table t data varchar 100 我想创建一个索引以便能够有效地执行以下操作 select from t where contains abc 和这个
  • Lucene 标准分析器与 Snowball

    刚刚开始使用 Lucene Net 我使用标准分析器索引了 100 000 行 运行了一些测试查询 并注意到如果原始术语是单数 则复数查询不会返回结果 我知道雪球分析器增加了词干支持 这听起来不错 不过 我想知道 超过标准的雪球锣是否有任何
  • 通过排列四个给定数字找到最大可能时间 HH:MM

    我最近为了工作晋升而参加了编码测试 这是我真正遇到的任务之一 我想知道什么是最好的方法来做到这一点 我使用了大量的 if 和 if else 这不是最干净的解决方案 但完成了工作 我被问到的问题是 将 4 个数字格式化为 24 小时时间 0
  • 融合元组以查找等价类

    假设我们有一个包含 k 个元素的有限域 D d1 dk 我们认为 S 是 D n 的子集 即一组 形式的元组 其中 ai 在 D 中 我们希望使用 S 2 D n 的子集 即一组 形式的元组 其中 Ai 是 D 的子集 来 紧凑地 表示它
  • 如何提高洪水填充例程的性能?

    我正在我的应用程序中实现四路洪水填充 伪代码如下 Flood fill node target color replacement color 1 If the color of node is not equal to target co
  • 如何在 Postgresql 中将 GIST 或 GIN 索引与 hstore 列一起使用?

    我正在使用 postgresql 9 3 的 hstore 我正在尝试对 hstore 列使用索引就像文档所述 http www postgresql org docs 9 3 static hstore html 我的问题是索引似乎没有被
  • 寻找簇的中心

    我有以下问题 进行抽象以找出关键问题 我有 10 个点 每个点与其他点有一定距离 我想要 能够找到簇的中心 即与其他点的成对距离最小的点 令 p j p k 表示点 j 和 k 之间的成对距离p i 是簇的中心点 iff p i s t m
  • 数字求和的算法?

    我正在寻找一种数字求和的算法 让我概述一下基本原则 假设你有一个号码 18268 1 8 2 6 8 25 2 5 7 7 是我们的最终数字 它基本上是将整个数字中的每个数字相加 直到我们得到一个 也称为 核心 数字 它经常被命理学家使用
  • 生成 2D 中的非简并点集 - C++

    我想在 2D 平面中创建一大组非退化的随机点云 整个集合中没有 3 个点在一条直线上 我有一个简单的解决方案 它生成一个随机浮点对 P new x y 并检查到目前为止生成的每对点 P1 P2 是否位于同一行 这需要 O n 2 检查添加到
  • 从对列表创建邻接列表类型结构

    在 C 中 我有 class Pair int val1 int val2 我有一个来自以下来源的配对列表 List
  • 查找重叠事件/时间的算法

    在处理自定义日历时 我不知道如何找到与任何其他时间段重叠的时间段 时段从 0 点至 720 点 上午 9 点至晚上 9 点 每个像素代表一分钟 var events id 1 start 0 end 40 an event from 9 0
  • 2 同一个表的同一列上的 PostgreSQL 索引 - 冗余吗?

    我有一个带有 2 个索引的 PostgreSQL 表 其中一项指数涵盖website id and tweet idcolumns 是唯一的 B 树索引 第二个索引仅涵盖website id列 并且是非唯一索引 如果第一个索引存在 第二个索
  • 对列表中的相邻元素进行分组

    假设我想编写一个函数来执行此操作 输入 1 1 3 3 4 2 2 5 6 6 输出 1 1 3 3 4 2 2 5 6 6 它将相同的相邻元素分组 这个方法的名称应该是什么 此操作有标准名称吗 In 1 1 3 3 4 2 2 5 6 6

随机推荐