lucene如何存储文档?

1tuwyuhd  于 2022-11-07  发布在  Lucene
关注(0)|答案(1)|浏览(307)

基本上,文档中的每个字段是如何存储在倒排索引中的?Lucene内部是否为每个字段创建了单独的索引?另外,假设一个查询是针对一个特定字段的,那么搜索在内部是如何工作的?
我知道倒排索引是如何工作的,但是如何在一个索引中存储多个字段,以及如何区分当请求时只搜索特定字段。

jobtbby3

jobtbby31#

正如我在评论中提到的,如果你想知道Lucene是如何存储索引数据的,你可以使用SimpleTextCodec。更多的细节和一些示例代码请参见如何查看Lucene索引。基本上,这会生成人类可读的索引文件(与通常的二进制压缩格式相反)。
以下是使用SimpleTextCodec时您可以预期看到的示例。

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

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

  1. Field textField1 = new TextField("bodytext1", content, Field.Store.NO);

假设我们有两个文档,如下所示(使用StandardAnalyzer进行分析:

  1. Document 0: echo charlie delta echo
  2. Document 1: bravo alfa charlie

这将给予我们一个基本的层次索引结构如下:

  1. field bodytext1
  2. term alfa
  3. doc 1
  4. freq 1
  5. pos 1
  6. term bravo
  7. doc 1
  8. freq 1
  9. pos 0
  10. term charlie
  11. doc 0
  12. freq 1
  13. pos 1
  14. doc 1
  15. freq 1
  16. pos 2
  17. term delta
  18. doc 0
  19. freq 1
  20. pos 2
  21. term echo
  22. doc 0
  23. freq 2
  24. pos 0
  25. pos 3

因此,一般结构为:

  1. field [field 1]
  2. term [token value]
  3. doc [document ID]
  4. frequency
  5. position
  6. field [field 2]
  7. term [token value]
  8. doc [document ID]
  9. frequency
  10. position

依此类推,索引的字段数与索引的字段数相同。
此结构支持基于字段的基本查询。
您可以将其总结为:

  1. field > term > doc > freq/pos

因此,***“Lucene是否在内部为每个字段创建单独的索引?"***是的,它会。
Lucene还可以在其索引文件中存储其他附加结构,这取决于您如何配置Lucene字段--因此,这不是唯一的数据索引方式。
例如,您可以请求对“术语向量”数据也进行索引,在这种情况下,您将看到一个附加的索引结构:

  1. doc 0
  2. numfields 1
  3. field 1
  4. name content2
  5. positions true
  6. offsets true
  7. payloads false
  8. numterms 3
  9. term charlie
  10. freq 1
  11. position 1
  12. startoffset 6
  13. endoffset 13
  14. term delta
  15. freq 1
  16. position 2
  17. startoffset 15
  18. endoffset 20
  19. term echo
  20. freq 2
  21. position 0
  22. startoffset 0
  23. endoffset 4
  24. position 3
  25. startoffset 23
  26. endoffset 27
  27. doc 1
  28. ...

此结构从文档开始,而不是从字段开始,因此非常适合处理已选定文档(例如“热门”文档)的文档。通过此结构,可以轻松定位特定文档字段中匹配单词的位置。
这还远远不是一个全面的列表,但是通过使用SimpleTextCodec,以及不同的字段类型、文档和分析器,您可以自己确切地看到Lucene是如何索引它的数据的。

展开查看全部

相关问题