【问题标题】:How to programmatically add an index column for NHibernate Search (Lucene.net) without using FieldAttribute如何在不使用 FieldAttribute 的情况下以编程方式为 NHibernate Search (Lucene.net) 添加索引列
【发布时间】:2009-12-18 15:03:51
【问题描述】:

我正在尝试了解如何以编程方式(即不使用 FieldAttribute)为 NHibernate Search (Lucene.net) 添加索引列。

由于FieldAttribute 不是自动继承,我遇到了继承问题。

以下代码说明了我想要做什么。

class A
{
    [Field(Index.Tokenized)]
    public virtual string P1
    {
        get
        {
            return "P1";
        }
    }
}

class B : A
{
    public override string P1
    {
        get
        {
            return "P1+";
        }
    }
}

我希望 P1 的覆盖被索引,但它没有。当我检查FieldAttribute 类时,我发现它没有在AttributeUsage 属性中指定Inherited = true

然后我将FieldAttribute 添加到被覆盖的属性中,但这导致NHibernate Search 退出,但异常指出具有相同键的项目已添加到字典中。我认为这是因为在类型链中有两个名称相同的属性,它们都带有 FieldAttribute,并且它只接受一个。

那么,我如何通过不使用FieldAttribute 以编程方式解决这个问题?

【问题讨论】:

    标签: nhibernate search lucene lucene.net


    【解决方案1】:

    最近实现了非属性映射,看看this blog post

    【讨论】:

    • 太好了,我没看到那个编辑,但我很高兴看到那个补丁进来了!
    【解决方案2】:

    我刚刚启动了一个类似于 FluentNHibarnate 的 Fluent NHibernate.Search 映射接口,它允许您映射没有属性的实体。

    public class BookSearchMap : DocumentMap<Book>
    {
        public BookSearchMap()
        {
            Id(p => p.BookId).Field("BookId").Bridge().Guid();
            Name("Book");
            Boost(500);
            Analyzer<StandardAnalyzer>();
    
            Map(x => x.Title)
                .Analyzer<StandardAnalyzer>()
                .Boost(500);
    
            Map(x => x.Description)
                .Boost(500)
                .Name("Description")
                .Store().Yes()
                .Index().Tokenized();
        }
    }
    

    您应该查看托管在 codeplex 上的项目站点。

    http://fnhsearch.codeplex.com/

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2011-06-16
      • 2012-09-06
      • 1970-01-01
      • 2012-01-28
      • 1970-01-01
      • 2013-03-09
      • 2022-01-21
      • 1970-01-01
      相关资源
      最近更新 更多