文档索引

本文档介绍如何将文档添加到索引中。

组件

  • Document- 包含实际文档及其字段。
  • RSAddDocumentCtx- 在 正在编制索引。索引完成后,该状态将被丢弃。
  • ForwardIndex- 包含在文档中找到的术语。正向索引 用于编写InvertedIndex.
  • InvertedIndex- 将术语映射到适用范围内的出现次数的索引 文件。

建筑

索引过程首先创建一个新的RSAddDocumentCtx并添加 document 添加到它。在内部,这分为几个步骤。

  1. 提交

    一个DocumentContext已创建,并与文档关联(如接收) from input。提交过程还将执行一些初步缓存。

  2. 预处理

    提交文档后,将对其进行预处理。预处理执行 对所有文档输入字段进行无状态处理。对于文本字段,此 表示对文档进行标记并创建正向索引。预处理程序 将此信息存储在AddDocumentCtx. 然后,此计算结果稍后将写入持久索引 索引阶段。

    如果文档足够大,则预处理将在单独的 thread 的 Bean 请求,它允许并发预处理,并且还避免了阻塞其他 线程。如果文档较小,则预处理在 main thread 的 intent 来避免额外的上下文切换的开销。 这SELF_EXC_THRESHOLDmacro 包含 'enoughly large' 的阈值。

    对文档进行预处理后,将提交该文档以进行索引。

  3. 索引

    正确索引包括提交 预处理阶段。它是在单个线程中完成的,其形式为 的队列。

    因为文档必须按照其 文档 ID 分配,并且因为索引过程还必须让步于其他潜在的 索引过程,您最终可能会遇到写入文档 ID 的情况 添加到索引中。为了解决这个问题,文档的顺序 实际上必须明确定义。如果只有一个线程写入 documents,则此线程将无需担心 ID 乱序 写作时。

    拥有单个后台线程还有助于在多个方面进行优化,例如 稍后会看到。基本思想是,当有很多 文档排队等待索引线程,则索引线程可能会处理它们 作为批处理命令,大大减少了 GIL 的锁定/解锁次数 以及需要打开和关闭术语键的次数。

  4. 跳过已编制索引的文档

    以下阶段可以一次对多个文档进行作。当文档 已完全编制索引,则标记为已完成。当线程遍历队列时 它只会对尚未标记为 DONE 的项目执行处理/索引。

  5. 术语合并

    术语合并或正向索引合并是在存在多个 队列中的单个文档。队列中每个文档的正向索引 ,并在其位置构造一个更大的 master forward 索引。 forward 索引中的每个条目都包含对原始文档的引用 以及 Normal offset/score/frequency 信息。

    创建主正向索引可避免每 次多次打开常用术语键 公文。

    如果队列中只有一个文档,则 master forward 索引 未创建。

    请注意,主正向索引的内部类型实际上并不是ForwardIndex.

  6. 文档 ID 分配

    此时,GIL 将被锁定,并且队列中的每个文档都将被分配 文档 ID。赋值在写入索引之前立即完成 以减少 GIL 被锁定的次数;因此,GIL 为 仅在写入索引之前锁定一次。

  7. 写入索引

    锁定 GIL 后,任何待处理的索引数据都将写入索引。 这通常涉及打开一个或多个 Redis 键,以及写入/复制 computed data 添加到这些键中。

    完成此作后,将发送给定文档的回复,并且AddDocumentCtx释放。

为本页评分
返回顶部 ↑