是否可以将自定义元数据添加到Lucene字段?

时间:2011-02-09 16:28:28

标签: lucene metadata lucene.net

我已经到了需要存储一些关于特定字段来自Lucene.Net索引的其他数据的地步。具体来说,我想在将字段添加到文档时将guid附加到文档的某些字段,并在从搜索结果中获取文档时再次检索它。

这可能吗?

修改 好的,让我通过举例说明一下。

假设我有一个对象,我想让用户使用自定义标签进行标记,例如“个人”,“收藏”,“某些项目”。我这样做是通过在文档中添加多个“标记”字段,如下所示:

doc.Add( new Field( "tag", "personal" ) );
doc.Add( new Field( "tag", "favorite" ) );

问题是我现在需要记录关于每个单独标签本身的一些元数据,特别是表示该标签来自哪里的guid(将其想象为用户ID)。每个标签可能有一个不同的guid,所以我不能简单地创建一个“tag-guid”字段(除非保留值的顺序 - 见下面的编辑2)。我不需要将这些元数据编入索引(实际上我不喜欢它,为了避免点击元数据),我只需要能够从文档/字段中再次检索它。

doc.GetFields( "tag" )[0].Metadata...

(我在这里编写语法,但我希望我的观点现在很明确。)

编辑2: 由于这是一个完全不同的问题,我发布了一个新方法:[{3}}

好吧让我们尝试另一种方法......关键问题领域是同一字段名称下多个字段值的不确定性(例如“标签”)。如果我可以在这里引入或获得某种确定性,我可能能够将元数据存储在另一个字段中。

例如,如果我可以依赖永不改变的字段值的顺序,我可以使用值集中的索引来准确识别我所指的标记。

当我稍后检索文档时,是否可以保证将值添加到字段的顺序保持不变?

2 个答案:

答案 0 :(得分:3)

根据您对此索引的搜索要求,这可能是可能的。这样你就可以控制字段的顺序。当标签列表发生变化时,它需要更新两个字段,但开销可能是值得的。

doc.Add(new Field("tags", "{personal}|{favorite}")); 
doc.Add(new Field("tagsref", "{1234}|{12345}")); 

注意:使用{}可以使搜索符合存在类似值的唯一性。

示例:如果将值存储为“person | personal | personage”,则搜索“person”将返回具有人,个人或人物中的任何一个的文档。通过大括号进行限定:“{person} | {personal} | {personage}”,我可以搜索“{person}”并确保它不会返回误报。当然,这假设您不在值中使用大括号。

答案 1 :(得分:2)

我想你在询问payloads

编辑:从您的使用案例来看,您似乎不希望在搜索中使用此元数据,您只需要它。 (基本上,您希望将Lucene用作数据库系统。)

那么,为什么你不能使用二进制字段?

ExtraData ed = new ExtraData { Tag = "tag", Type = "personal" };
byte[] byteData = BinaryFormatter.Serialize(ed); // this isn't the correct code, but you get the point
doc.Add(new Field("myData", byteData, Field.Store.YES));

然后你可以在检索时反序列化它。