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

是否可以将自定义元数据添加到Lucene字段?,lucene,metadata,lucene.net,Lucene,Metadata,Lucene.net,我已经到了需要在我的Lucene.Net索引中存储一些关于特定字段来源的附加数据的地步。具体来说,我希望在将字段添加到文档中时将guid附加到文档的某些字段,并在从搜索结果中获取文档时再次检索guid 这可能吗 编辑: 好的,让我举个例子来澄清一下 假设我有一个对象,我想让用户用自定义标记来标记它,比如“个人”、“收藏”、“某个项目”。为此,我向文档中添加了多个“标记”字段,如下所示: doc.Add( new Field( "tag", "personal" ) ); doc.Add( new

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

这可能吗

编辑: 好的,让我举个例子来澄清一下

假设我有一个对象,我想让用户用自定义标记来标记它,比如“个人”、“收藏”、“某个项目”。为此,我向文档中添加了多个“标记”字段,如下所示:

doc.Add( new Field( "tag", "personal" ) );
doc.Add( new Field( "tag", "favorite" ) );
问题是我现在需要记录关于每个标记本身的一些元数据,特别是表示该标记来源的guid(将其想象为用户id)。每个标记可能具有不同的guid,因此我不能简单地创建“标记guid”字段(除非保留值的顺序---请参见下面的编辑2)。我不需要索引这个元数据(事实上,我更希望它不被索引,以避免在元数据上被点击),我只需要能够从文档/字段中再次检索它

doc.GetFields( "tag" )[0].Metadata...
(我在这里编语法,但我希望我的观点现在清楚了。)

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

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

例如,如果我可以依赖于字段值的顺序永远不变,那么我可以使用值集中的索引来准确标识我引用的标记


是否有任何保证,在以后检索文档时,我向字段添加值的顺序将保持不变?

我想你是在问这个问题

编辑:从您的用例来看,听起来您不想在搜索中使用此元数据,您只想在那里使用它。(基本上,您希望使用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));

然后,您可以在检索时对其进行反序列化。

根据您对此索引的搜索要求,这是可能的。这样可以控制字段的顺序。当然,随着标记列表的变化,这需要更新这两个字段,但是开销可能是值得的

doc.Add(new Field("tags", "{personal}|{favorite}")); 
doc.Add(new Field("tagsref", "{1234}|{12345}")); 
注意:使用{}可以在存在类似值的情况下限定搜索的唯一性


示例:如果值存储为“person | personal | personage”,搜索“person”将返回一个包含person、personal或personage中任意一个的文档。通过在像这样的花括号中限定“{person}{personal}{personal}{personage}”,我可以搜索“{person}”,并确保它不会返回误报。当然,这假设您的值中不使用花括号。

您可以将其添加到文档中吗:document.add(新字段(“GUID”、“guidvalue”、Field.Store.YES、Field.Index.NO”)@问题是我为同一字段添加了多个值(例如“标签”),我需要跟踪每个标签的某些原始信息,因此,我无法只添加一个新字段来跟踪它,因为我无法唯一地识别它们。@chaiguy我很难完全理解你的意思-你能给出一个超级简单的例子吗?@chaiguy Prescott是对的,你可以将多个字段添加到文档中只用于存储-这是一种常见的做法,试图在这里澄清:假设以下定义文档{DocId,Text,Author,CreatedDate}。您是说您还想向各个字段添加其他数据吗。在本例中,假设您想用GUID标记Author,以便为此文档添加一个新字段AuthorGUID?这对于权重来说似乎更有用,因为Grant正在使用它来计算权重。我可以看到如何扩展它来标记数据片段,但它似乎更适合于字段本身的特殊处理(即“文本数据”->“文本10数据5”--添加不同的权重。在这种情况下,我认为他需要类似“文本数据”的东西|GUID-所以GUID指的是整个字段,而不是字段的各个部分,也不是整个文档。我浏览了那一页,但有效负载似乎太复杂了,无法满足我的需要。看来我必须编写一个完全自定义的分析器并手动生成令牌流。不过,我很好奇这些增强功能……有可能吗o对字段的字符串值进行分段,以便我可以附加metatdata并将其赋值为0,以便查询可以忽略它?这是标准分析器支持的还是我必须使用另一个/编写自己的?@chaiguy:我编辑了我的答案:这是您想要的吗?您是对的,我不想使用在搜索中使用元数据,但我确实希望能够在搜索中使用字段的值(例如标记)。我用另一种方法更新了这个问题。这就是我最终要做的。你能进一步解释一下{}字符的含义吗?这仅仅是为了搜索还是存储字段数据(就像你正在做的那样)?更新了关于花括号的更多细节。