Индексирование полей подкласса с помощью IndexEmbedded - PullRequest
1 голос
/ 19 марта 2011

Я использую 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; }
}

Проблема в том, что я пытаюсь проиндексировать класс записи. Цель состоит в том, чтобы получить все поля класса File и подкласса CaseFile, содержащиеся в индексе Record. Но когда я индексирую класс Record, я получаю только поля суперкласса File в моем индексе записей. Поля подкласса CaseFile отсутствуют в индексе записи.

Я также пробовал [IndexedEmbedded(TargetElement = typeof(CaseFile))] в свойстве ParentFile в классе Record, но это приводит к совершенно пустым индексам или вообще к отсутствию индексации.

Если я индексирую класс File, ожидаемые свойства подкласса индексируются, как и ожидалось, в индексе File.

Кто-нибудь сталкивался с подобными проблемами при поиске Hibernate/NHibernate?

Ответы [ 2 ]

1 голос
/ 17 мая 2011

Я обсуждал проблему с поиском Hibernate / NHibernate, и они подтвердили, что ситуация является ошибкой.

Они рекомендовали использовать настраиваемый класс-мост для добавления отсутствующих полей в индекс, в котором я хотел бы его видеть.

Это было намного чище, и я был доволен этим решением до источника в Hibernate./ Поиск NHibernate исправлен.

1 голос
/ 17 мая 2011

У меня возникла та же проблема, и мне удалось обойти эту проблему, выполнив что-то похожее на следующее.

Это не самое лучшее решение.

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

Дайте мне знать, если найдете более чистое решение.

...