3

当我使用 Lucene 索引我的实体时,我习惯将所有索引属性放在一个名为“all”的字段中,以对我的“所有”实体类型执行搜索。

现在,使用 NHibernate.Search,我找不到如何做到这一点。我试过这个:

[Indexed(Index = "MyIndex")]
public class Post
{
    [DocumentId]
    public virtual int Id { get; set; }
    [IndexedEmbedded]
    public virtual Author Author { get; set; }
    [IndexedEmbedded]
    public virtual IEnumerable<Category> Categories { get; set; }
    [Field(Index.Tokenized, Store = Store.Yes)]
    [Field(Name = "All", Index = Index.Tokenized, Store = Store.Yes)]
    public virtual string Name { get; set; }
    [Field(Name = "All", Index = Index.Tokenized, Store = Store.Yes)]
    [Field(Index.Tokenized, Store = Store.Yes)]
    public virtual string Body { get; set; }
}

但是我在 ScopedAnalyzer.cs 第 26 行中抛出了一个异常:“字典中已存在密钥”:

scopedAnalyzers.Add(scope, analyzer);

其中“范围”是索引字段的名称(此处为“全部”)。如果我像

if( !scopedAnalyzers.ContainsKey( scope ) )

它会很好地工作:我将为每个“发布”文档设置 2 个字段,一个带有正文,一个带有名称。但是,我并不容易修改 NHibernate.Search 源代码。

有人对如何在一个字段中索引不同的属性有建议吗?

4

1 回答 1

2

如果您在使用字段属性来指定您需要的内容时遇到问题,您可以创建一个类桥,允许您创建自己的文档。

只需在类定义上使用 ClassBridgeAttribute 并指定实现 IFieldBridge 接口的类型。这将允许您完全控制 Lucene 文档的构建方式。

更多信息可以在http://docs.jboss.org/hibernate/stable/search/reference/en/html/search-mapping-bridge.html中找到,参见 4.2.2.3。ClassBridge部分

于 2010-02-21T05:22:37.103 回答