Lucene支持多级索引吗?

s4chpxco  于 2023-05-06  发布在  Lucene
关注(0)|答案(1)|浏览(171)
The structure of data to index is like below:

{
  "EmailId":"1",  //should be stored
  "EmailText":"hello world",
  "Attachments": 
                {
                   "AttachmentId":"1",  //should be stored
                   "FileName": "hello.txt"  //should be stored
                   "AttachmentText":"this is first attachment text"
                },
                {
                   "AttachmentId":"2",
                   "FileName": "welcome.xlsx"
                   "AttachmentText":"this is second attachment text"
                }
}

我可以为电子邮件正文和附件文本维护一个单独的索引,但是我们是否可以像上面那样做一个多级索引来维护一个索引?我应该能够在AttachmentText中搜索关键字并获取AttachmentId和EmailId。
我正在使用Lucene.Net,但如果LuceneJava中有任何解决方案,那么它绝对是好的。
先谢谢你。

cx6n0qe3

cx6n0qe31#

一种方法:
您可以扁平化源数据:

doc1包含:

EmailId = 1AttachmentId = 1AttachmentText = this is first attachment text

doc2包含:

EmailId = 1AttachmentId = 2AttachmentText = this is second attachment text
等等
当然,这不是使数据扁平化的唯一方法。这取决于您要执行的所有搜索类型。还可以存在其他合适的方式来使数据平坦化。
关于评论:
查询时将返回重复的EmailId [w]...
是的--我想说你可以在运行查询后对结果数据(Lucene文档命中)进行重复数据删除。这真的取决于你打算如何处理你的搜索结果。如果您想向用户显示它们,那么您可以将“平面”结果转换回层次结构。
还有一点值得补充:
一些扁平化方法可能会导致您拥有大量重复的索引数据-例如,如果您想要搜索EmailText数据。为了避免这种情况,我使用了两种不同的文档结构:
文档A:用于搜索附件文本的字段:

  • AttachmentEmailId(这是源数据的EmailId字段)
  • AttachmentId
  • AttachmentText

文档B:用于搜索电子邮件正文的字段:

  • EmailId
  • EmailText

这样,每个EmailText中的数据不会被索引多次。
一个Lucene索引可以有多个不同的文档。如上所述,当呈现结果时,您可以重建原始数据的层次结构(如果您需要/想要这样做)。
另一种方法是更通用的结构-类似于:

单据字段:

  • Id(可以是EmailId值或AttachmentId值)
  • Text
  • ParentId(如果IdEmailId值,则为空)

这里只需要一个doc结构。

相关问题