lucene如何存储文档?

lucene如何存储文档?,lucene,Lucene,基本上,文档中的每个字段如何存储在反向索引中?Lucene是否在内部为每个字段创建单独的索引?另外,假设一个查询是在一个特定的字段上,那么搜索在内部是如何工作的呢 我知道反向索引是如何工作的。但是如何在一个索引中存储多个字段,以及如何区分何时在请求时只搜索特定字段。正如我在评论中提到的,如果您想了解Lucene如何存储索引数据,可以使用SimpleTextCodec。有关更多详细信息和一些示例代码,请参见此答案。基本上,这会生成人类可读的索引文件(与通常的二进制压缩格式相反) 下面是使用Simp

基本上,文档中的每个字段如何存储在反向索引中?Lucene是否在内部为每个字段创建单独的索引?另外,假设一个查询是在一个特定的字段上,那么搜索在内部是如何工作的呢


我知道反向索引是如何工作的。但是如何在一个索引中存储多个字段,以及如何区分何时在请求时只搜索特定字段。

正如我在评论中提到的,如果您想了解Lucene如何存储索引数据,可以使用SimpleTextCodec。有关更多详细信息和一些示例代码,请参见此答案。基本上,这会生成人类可读的索引文件(与通常的二进制压缩格式相反)

下面是使用
SimpleTextCodec
时可以看到的示例

如何在一个索引中存储多个字段?

为了显示一个基本示例,假设我们有一个定义如下的Lucene文本字段:

Field textField1 = new TextField("bodytext1", content, Field.Store.NO);
field bodytext1
  term alfa
    doc 1
      freq 1
      pos 1
  term bravo
    doc 1
      freq 1
      pos 0
  term charlie
    doc 0
      freq 1
      pos 1
    doc 1
      freq 1
      pos 2
  term delta
    doc 0
      freq 1
      pos 2
  term echo
    doc 0
      freq 2
      pos 0
      pos 3
假设我们有以下两个文档(使用StandardAnalyzer分析):

Document 0: echo charlie delta echo
Document 1: bravo alfa charlie
这将为我们提供一个基本的层次索引结构,如下所示:

Field textField1 = new TextField("bodytext1", content, Field.Store.NO);
field bodytext1
  term alfa
    doc 1
      freq 1
      pos 1
  term bravo
    doc 1
      freq 1
      pos 0
  term charlie
    doc 0
      freq 1
      pos 1
    doc 1
      freq 1
      pos 2
  term delta
    doc 0
      freq 1
      pos 2
  term echo
    doc 0
      freq 2
      pos 0
      pos 3
因此,总的结构是:

field [field 1]
  term [token value]
    doc [document ID]
      frequency
      position
field [field 2]
  term [token value]
    doc [document ID]
      frequency
      position
以此类推,索引的字段数量不限

此结构支持基本的基于字段的查询

您可以将其概括为:

field > term > doc > freq/pos
所以,“Lucene是否在内部为每个字段创建单独的索引?”是的,确实如此


Lucene还可以在其索引文件中存储其他附加结构,这取决于您如何配置Lucene字段-因此,这不是索引数据的唯一方法

例如,您可以请求对“术语向量”数据也进行索引,在这种情况下,您将看到一个额外的索引结构:

doc 0
  numfields 1
  field 1
    name content2
    positions true
    offsets   true
    payloads  false
    numterms 3
    term charlie
      freq 1
      position 1
        startoffset 6
        endoffset 13
    term delta
      freq 1
      position 2
        startoffset 15
        endoffset 20
    term echo
      freq 2
      position 0
        startoffset 0
        endoffset 4
      position 3
        startoffset 23
        endoffset 27
doc 1
  ...
这种结构是从文档开始的,而不是从字段开始的,因此非常适合处理已经选择了文档的文档(例如“热门”文档)。通过这种结构,可以很容易地找到特定文档字段中匹配单词的位置



这远不是一个全面的列表。但是通过使用
SimpleTextCodec
,以及不同的字段类型、文档和分析器,您可以自己确切地看到Lucene如何索引其数据。

如果您想了解Lucene如何存储索引数据,可以使用
SimpleTextCodec
。有关更多详细信息,请参阅此答案我的示例代码。基本上,这会生成人类可读的索引文件(与通常的二进制压缩格式相反)。感谢您的回答。它确实帮助了我的理解。我将亲自研究SimpleTextCodec以尝试此功能。:)