(N) Hibernate.Search: индексирование различных свойств в одном поле - PullRequest
3 голосов
/ 11 октября 2009

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

Теперь, используя 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 поля для каждого документа "Пост", одно с телом, одно с именем. Однако мне нелегко изменить исходный код NHibernate.Search.

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

1 Ответ

2 голосов
/ 21 февраля 2010

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

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

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

...