(N)Hibernate.Search: индексировать разные свойства в одном поле.

Когда я использовал Lucene для индексации своих сущностей, у меня была привычка помещать все мои проиндексированные свойства в поле с именем «все», чтобы выполнять поиск по «всем» типам моих сущностей.

Теперь, используя NHibernate.Search, я не могу найти, как это сделать. Я пробовал это:

[Indexed(Index = "MyIndex")]
public class Post
{
    [DocumentId]
    public virtual int Id { get; set; }
    [IndexedEmbedded]
    public virtual Author Author { get; set; }
    [IndexedEmbedded]
    public virtual IEnumerable<Category> Categories { get; set; }
    [Field(Index.Tokenized, Store = Store.Yes)]
    [Field(Name = "All", Index = Index.Tokenized, Store = Store.Yes)]
    public virtual string Name { get; set; }
    [Field(Name = "All", Index = Index.Tokenized, Store = Store.Yes)]
    [Field(Index.Tokenized, Store = Store.Yes)]
    public virtual string Body { get; set; }
}

Но у меня есть исключение: «ключ уже присутствует в словаре», в строке 26 ScopedAnalyzer.cs:

scopedAnalyzers.Add(scope, analyzer);

Где «область» — это имя поля индекса (здесь «Все»). Если я поставлю галочку вроде

if( !scopedAnalyzers.ContainsKey( scope ) )

это будет работать довольно хорошо: у меня будет 2 поля для каждого документа «Post», одно с телом, одно с именем. Однако мне нелегко модифицировать исходный код NHibernate.Search.

У кого-нибудь есть предложение о том, как индексировать разные свойства в одном поле?


person mathieu    schedule 10.10.2009    source источник
comment
также помечен hibernate.search, поскольку API (довольно) одинаковы...   -  person mathieu    schedule 11.10.2009


Ответы (1)


Если у вас возникли проблемы с использованием атрибутов поля для указания того, что вам нужно, вы можете создать мост класса, который позволит вам создать свой собственный документ.

просто используйте ClassBridgeAttribute в определении класса и укажите тип, реализующий интерфейс IFieldBridge. Это позволит вам полностью контролировать процесс создания документов Lucene.

дополнительную информацию можно найти по адресу http://docs.jboss.org/hibernate/stable/search/reference/en/html/search-mapping-bridge.html см. 4.2.2.3. Раздел ClassBridge

person Andrew Smith    schedule 21.02.2010