lucene如何存储文件?
How does lucene store a document?
基本上,文档中的每个字段如何存储在倒排索引中? Lucene 是否在内部为每个字段创建单独的索引?另外假设查询针对特定字段,搜索在内部如何工作?
我知道倒排索引是如何工作的。但是如何将多个字段存储在一个索引中,以及如何区分何时只在请求时搜索特定字段。
正如我在评论中提到的,如果您想了解 Lucene 如何存储索引数据,您可以使用 SimpleTextCodec。有关更多详细信息和一些示例代码,请参阅此答案 How to view Lucene Index。基本上,这会生成人类可读的索引文件(与通常的二进制压缩格式相反)。
下面是您在使用 SimpleTextCodec
.
时预期会看到的示例
如何在单个索引中存储多个字段?
为了展示一个基本示例,假设我们有一个定义如下的 Lucene 文本字段:
Field textField1 = new TextField("bodytext1", content, Field.Store.NO);
假设我们有如下两个文档(使用 StandardAnalyzer 分析:
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 [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 是否在内部为每个字段创建单独的索引?另外假设查询针对特定字段,搜索在内部如何工作?
我知道倒排索引是如何工作的。但是如何将多个字段存储在一个索引中,以及如何区分何时只在请求时搜索特定字段。
正如我在评论中提到的,如果您想了解 Lucene 如何存储索引数据,您可以使用 SimpleTextCodec。有关更多详细信息和一些示例代码,请参阅此答案 How to view Lucene Index。基本上,这会生成人类可读的索引文件(与通常的二进制压缩格式相反)。
下面是您在使用 SimpleTextCodec
.
如何在单个索引中存储多个字段?
为了展示一个基本示例,假设我们有一个定义如下的 Lucene 文本字段:
Field textField1 = new TextField("bodytext1", content, Field.Store.NO);
假设我们有如下两个文档(使用 StandardAnalyzer 分析:
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 [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 是如何对其数据进行索引的。