我正在使用NHibernate.Search和Lucene.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; }
}问题是当我试图索引record类时。目标是获取包含在Record索引中的File类和子类CaseFile的所有字段。但是当我索引Record类时,我只能在我的记录索引中获得File超类的字段。记录索引中缺少CaseFile子类的字段。
我还在Record类中的ParentFile属性上尝试了[IndexedEmbedded(TargetElement = typeof(CaseFile))],但这导致索引完全为空,或者根本没有索引。
如果我为File类编制索引,则预期的子类属性将按照预期在File索引中编制索引。
有没有人在Hibernate/NHibernate搜索中遇到过类似的问题?
发布于 2011-05-17 14:02:15
我和Hibernate/NHibernate search讨论了这个问题,他们确认这是一个bug。
他们建议使用自定义类桥将缺少的字段添加到我希望它所在的索引中。
这要干净得多,我对这个解决方案感到满意,直到Hibernate/NHibernate搜索中的源代码得到修复。
发布于 2011-05-17 08:42:35
我遇到了同样的问题,我设法实现了一个变通方法,做了类似下面的事情。
不过,这不是最好的解决方案。
[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) });如果您找到了更干净的解决方案,请告诉我。
https://stackoverflow.com/questions/5360787
复制相似问题