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中有任何解决方案,那么它绝对是好的。
先谢谢你。
1条答案
按热度按时间cx6n0qe31#
一种方法:
您可以扁平化源数据:
doc1
包含:EmailId
=1
,AttachmentId
=1
,AttachmentText
=this is first attachment text
。doc2
包含:EmailId
=1
,AttachmentId
=2
,AttachmentText
=this is second attachment text
等等
当然,这不是使数据扁平化的唯一方法。这取决于您要执行的所有搜索类型。还可以存在其他合适的方式来使数据平坦化。
关于评论:
查询时将返回重复的
EmailId
[w]...是的--我想说你可以在运行查询后对结果数据(Lucene文档命中)进行重复数据删除。这真的取决于你打算如何处理你的搜索结果。如果您想向用户显示它们,那么您可以将“平面”结果转换回层次结构。
还有一点值得补充:
一些扁平化方法可能会导致您拥有大量重复的索引数据-例如,如果您想要搜索
EmailText
数据。为了避免这种情况,我使用了两种不同的文档结构:文档A:用于搜索附件文本的字段:
AttachmentEmailId
(这是源数据的EmailId
字段)AttachmentId
AttachmentText
文档B:用于搜索电子邮件正文的字段:
EmailId
EmailText
这样,每个
EmailText
中的数据不会被索引多次。一个Lucene索引可以有多个不同的文档。如上所述,当呈现结果时,您可以重建原始数据的层次结构(如果您需要/想要这样做)。
另一种方法是更通用的结构-类似于:
单据字段:
Id
(可以是EmailId
值或AttachmentId
值)Text
ParentId
(如果Id
是EmailId
值,则为空)这里只需要一个doc结构。