基本上,文档中的每个字段是如何存储在倒排索引中的?Lucene内部是否为每个字段创建了单独的索引?另外,假设一个查询是针对一个特定字段的,那么搜索在内部是如何工作的?我知道倒排索引是如何工作的,但是如何在一个索引中存储多个字段,以及如何区分当请求时只搜索特定字段。
jobtbby31#
正如我在评论中提到的,如果你想知道Lucene是如何存储索引数据的,你可以使用SimpleTextCodec。更多的细节和一些示例代码请参见如何查看Lucene索引。基本上,这会生成人类可读的索引文件(与通常的二进制压缩格式相反)。以下是使用SimpleTextCodec时您可以预期看到的示例。
SimpleTextCodec
如何在单个索引中存储多个字段?
为了显示一个基本示例,假设我们有一个Lucene文本字段,定义如下:
Field textField1 = new TextField("bodytext1", content, Field.Store.NO);
假设我们有两个文档,如下所示(使用StandardAnalyzer进行分析:
Document 0: echo charlie delta echoDocument 1: bravo alfa charlie
Document 0: echo charlie delta echo
Document 1: bravo alfa charlie
这将给予我们一个基本的层次索引结构如下:
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 bodytext1
term alfa
doc 1
freq 1
pos 1
term bravo
pos 0
term charlie
doc 0
pos 2
term delta
term echo
freq 2
pos 3
因此,一般结构为:
field [field 1] term [token value] doc [document ID] frequency positionfield [field 2] term [token value] doc [document ID] frequency position
field [field 1]
term [token value]
doc [document ID]
frequency
position
field [field 2]
依此类推,索引的字段数与索引的字段数相同。此结构支持基于字段的基本查询。您可以将其总结为:
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 27doc 1 ...
numfields 1
field 1
name content2
positions true
offsets true
payloads false
numterms 3
position 1
startoffset 6
endoffset 13
position 2
startoffset 15
endoffset 20
position 0
startoffset 0
endoffset 4
position 3
startoffset 23
endoffset 27
...
此结构从文档开始,而不是从字段开始,因此非常适合处理已选定文档(例如“热门”文档)的文档。通过此结构,可以轻松定位特定文档字段中匹配单词的位置。这还远远不是一个全面的列表,但是通过使用SimpleTextCodec,以及不同的字段类型、文档和分析器,您可以自己确切地看到Lucene是如何索引它的数据的。
1条答案
按热度按时间jobtbby31#
正如我在评论中提到的,如果你想知道Lucene是如何存储索引数据的,你可以使用SimpleTextCodec。更多的细节和一些示例代码请参见如何查看Lucene索引。基本上,这会生成人类可读的索引文件(与通常的二进制压缩格式相反)。
以下是使用
SimpleTextCodec
时您可以预期看到的示例。如何在单个索引中存储多个字段?
为了显示一个基本示例,假设我们有一个Lucene文本字段,定义如下:
假设我们有两个文档,如下所示(使用StandardAnalyzer进行分析:
这将给予我们一个基本的层次索引结构如下:
因此,一般结构为:
依此类推,索引的字段数与索引的字段数相同。
此结构支持基于字段的基本查询。
您可以将其总结为:
因此,***“Lucene是否在内部为每个字段创建单独的索引?"***是的,它会。
Lucene还可以在其索引文件中存储其他附加结构,这取决于您如何配置Lucene字段--因此,这不是唯一的数据索引方式。
例如,您可以请求对“术语向量”数据也进行索引,在这种情况下,您将看到一个附加的索引结构:
此结构从文档开始,而不是从字段开始,因此非常适合处理已选定文档(例如“热门”文档)的文档。通过此结构,可以轻松定位特定文档字段中匹配单词的位置。
这还远远不是一个全面的列表,但是通过使用
SimpleTextCodec
,以及不同的字段类型、文档和分析器,您可以自己确切地看到Lucene是如何索引它的数据的。