首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >按IndexEmbedded索引子类字段

按IndexEmbedded索引子类字段
EN

Stack Overflow用户
提问于 2011-03-19 15:25:57
回答 2查看 311关注 0票数 1

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

代码语言:javascript
运行
复制
[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; }
}

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

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

如果我为File类编制索引,则预期的子类属性将按照预期在File索引中编制索引。

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

EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2011-05-17 14:02:15

我和Hibernate/NHibernate search讨论了这个问题,他们确认这是一个bug。

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

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

票数 1
EN

Stack Overflow用户

发布于 2011-05-17 08:42:35

我遇到了同样的问题,我设法实现了一个变通方法,做了类似下面的事情。

不过,这不是最好的解决方案。

代码语言:javascript
运行
复制
[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进行查询。

代码语言:javascript
运行
复制
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
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/5360787

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档