Я возился с NHibernate Search и Lucene, чтобы создать поисковый индекс юридических лиц. Моя модель домена выглядит примерно так:
[Indexed]
public abstract class LegalEntity : AggregateRoot
{
public virtual Address Address { get; set; }
}
public class Person : LegalEntity
{
public virtual string FirstNames { get; set; }
public virtual string LastName { get; set; }
}
public class Company: LegalEntity
{
public virtual string Name { get; set; }
}
public class Address : Component
{
public virtual string Street { get; set; }
public virtual string HouseNumber { get; set; }
// etc...
}
Как следует из подклассов, LegalEntity
является сущностью NHibernate, специализирующейся как Person
и Company
, а Address
является компонентом NHibernate.
Теперь, как мне лучше всего создать действительно похожий на Google нечеткий поиск, который включает все поля LegalEntity
, включая поля внутри компонента Address
?
Моей первой идеей было реализовать AddressFieldBridge
, чтобы помочь в вводе полей компонента Address
, а затем просто добавить [Field]
для всех полей, но тогда я не смог найти способ построить FuzzyQuery
как соединение между несколькими поисковыми терминами.
Моей следующей идеей было создание абстрактного свойства, помеченного [Field]
на LegalEntity
, например:
[Field(Index.Tokenized)]
public abstract string SearchableText { get; }
и затем Person
и Company
возвращают тексты, которые объединяют имена и все поля из компонента Address
в одну строку, которая затем будет разбита на токены и проиндексирована Lucene.
Это, однако, заставило меня чувствовать себя немного непристойно.
Я хотел бы изучить лучший и наименее навязчивый (с точки зрения модели предметной области) способ решения этой задачи - любые предложения приветствуются:)