1

我正在使用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类和子类的所有字段。但是当我索引该类时,我只能在我的记录索引中获得超类的字段。记录索引中缺少子类的字段。CaseFileRecordRecordFileCaseFile

我也尝试过[IndexedEmbedded(TargetElement = typeof(CaseFile))]on类ParentFile中的属性Record,但这会导致索引完全为空,或者根本没有索引。

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

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

4

2 回答 2

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) });

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

于 2011-05-17T00:42:35.430 回答
1

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

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

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

于 2011-05-17T06:02:14.600 回答