Apache Lucene - Index File Forma

2022-12-06  本文已影响0人  MasonChan

资料来源:

Package org.apache.lucene.codecs.lucene94

Lucene 9.3 file format.

Apache Lucene - Index File Formats

介绍
定义
    倒排索引
    field 类型
    段
    doc id
索引结构概述
File Naming
Summary of File Extensions
    Lock File
    History
    Limitations

介绍

此文档定义了当前 Lucene 版本的索引文件格式。If you are using a different version of Lucene, please consult the copy of docs/ that was distributed with the version you are using.

本文试图提供 Apache Lucene 文件格式的高级定义。

定义

Lucene 的基本概念是索引(index)、文档(document)、字段(field)和词(term):

文档 Document

doc 是 json 格式的文本,一个简单的例子:

{"k0":"123", "k1":"123", "k2":"hello world"}

域 Field

field 是一个 json 的 element,由 field name 和 field value 组成,field value 通常叫做 filed text。

上面 doc 例子中共有 3 个 field:

词 Term

源代码:lucene-9.4.1-src/lucene-9.4.1/lucene/core/src/java/org/apache/lucene/index/Term.java

MySQL 的基本检索单位是 column,由 column name 和 column value 组成;类似的,在 Lucene 基本检索单位是 term,term 由 term name 和 term value 组成:

分词 tokenize 在 Lucene 中是一个很基本操作,在创建倒排索引时会用到,在进行检索时也会用到。不同的语言、不同的分词方式,会导致很多分词器 tokenizer 的产生,这些分词器通常以插件的形式(jar 包)存在

假如使用空格作为分隔符来进行分词,那么上面的 doc 例子中共有 4 个 term:

term0 和 term1 虽然 value 的内容是一样的,但 ,term name 不一样,所以 term0 和 term1 会被当做 2 个不同的 term。

倒排索引

Lucene 的 index 存储了 term 和 term 的统计信息,使得基于 term 的搜索更加高效。

类似于 MySQL 的 column 索引,Lucene 的 term 也有索引,它们都是针对 value 建立索引,但是不同的是 column 索引是正排索引, 而 term 索引是一个倒排索引(inverted index)。在正常思维中,我们通常先找到 doc,再找到 doc 里面的 term,这就是正排索引建立的基本逻辑;而倒排索引的基本逻辑是,通过指定的 term,反过来找包含这个 term 的 doc 。

Types of Fields

一个 field 既可以被存储,也可以被索引:

也就是说,一个 Lucene index,不但存储了 field 原数据,也存储了 field 的索引,这 2 种数据存储在不同的文件中,文件格式也不一样。

建立倒排索引时,按照用户定义的分词方式,field text 既可能被分割成多个 term,也可能被当成 1 个 term,例如进行自然语言识别时,后者效果显然比前者的要好。

Lucene index 由多个子索引组成,子索引又称作段 segment 。每一个 segment 都是一个完全独立的 index,提供独立的读写功能。所以 index 与 segment 之间有以下表现:

文档编号

在 Lucene 内部,使用文档编号 document number 来表示一个文档, document number 也叫 document id。index 的第一个 doc 编号为 0,依次递增。

请注意,文档编号可能会变化,因此在 Lucene 之外存储这些数字时要小心。一般来说,一下几种情况会导致文档编号发生变化:

索引结构概述

每个 segment index 包含以下信息:

上一篇下一篇

猜你喜欢

热点阅读