通过IndexEmbedded索引子类字段

时间:2011-03-19 07:25:57

标签: .net nhibernate indexing lucene.net nhibernate.search

我正在使用NHibernate.SearchLucene.Net。我会问是否有人遇到过类似的问题。这是关于以下三个类的情况。

[Indexed]
public class File 
{
    [Field]
    public virtual string FileId { get; private set; }

    [ContainedIn]
    public virtual List<Record> Records { get; private set; }
}

[Indexed]
public class CaseFile : File
{
    [Field]
    public virtual int CaseYear { get; set; }
    [Field]
    public virtual int CaseSequenceNumber { get; set; }
}

[Indexed]
public class Record
{
    [IndexedEmbedded]
    public virtual File ParentFile { get; set; }
}

问题是当我尝试索引记录类时。目标是获取File索引中包含的CaseFile类和子类Record的所有字段。但是当我索引Record类时,我只在记录索引中获得File超类的字段。 Record索引中缺少CaseFile子类的字段。

我还在[IndexedEmbedded(TargetElement = typeof(CaseFile))]类的ParentFile属性上尝试了Record,但这会导致完全空索引,或根本没有索引。

如果我索引File类,那么预期的子类属性将按照File索引中的预期进行索引。

有没有人遇到Hibernate/NHibernate搜索的类似问题?

2 个答案:

答案 0 :(得分:1)

我遇到了同样的问题,我设法通过执行类似以下的操作来实现解决方法。

虽然这不是最好的解决方案。

[Indexed]
public class File 
{
    [Field]
    public virtual string FileId { get; private set; }

    [ContainedIn]
    public virtual List<Record> Records { get; private set; }


    [Field(Index.Tokenized, Store = Store.Yes)]
    public virtual string CaseYearSearch
    {
        get
        {
            if(GetType() == typeof(CaseFile))
            {
                return ((CaseFile)this).CaseYear;
            }
            return "";
        }
    }

    [Field(Index.Tokenized, Store = Store.Yes)]
    public virtual string CaseSequenceNumberSearch
    {
        get
        {
            if(GetType() == typeof(CaseFile))
            {
                return ((CaseFile)this).CaseSequenceNumber;
            }
            return "";
        }
    }
}

public class CaseFile : File
{
    public virtual int CaseYear { get; set; }
    public virtual int CaseSequenceNumber { get; set; }
}

[Indexed]
public class Record
{
    [IndexedEmbedded]
    public virtual File ParentFile { get; set; }
}

我正在使用MultiFieldQueryParser进行查询。

IFullTextSession session = Search.CreateFullTextSession(Session);

var parser = new MultiFieldQueryParser(new[] { "File.CaseYearSearch", "File.CaseSequenceNumberSearch" }, new CustomAnalyzer());
parser.SetDefaultOperator(QueryParser.Operator.OR);

var booleanQuery = new BooleanQuery();
booleanQuery.Add(parser.Parse(terms), BooleanClause.Occur.MUST);
booleanQuery.Add(new TermQuery(new Term("Status", ((int)Status.Active).ToString())), BooleanClause.Occur.MUST);

return session.CreateFullTextQuery(booleanQuery, new[] { typeof(Record) });

如果您找到更清洁的解决方案,请告诉我。

答案 1 :(得分:1)

我讨论了Hibernate / NHibernate搜索的问题,他们确认情况是一个错误。

他们建议使用自定义类桥将缺少的字段添加到我希望它所在的索引中。

这个更干净,我对这个解决方案感到满意,直到Hibernate / NHibernate搜索中的源代码得到修复。