(N)Hibernate.Search: индексирование различных свойств в одном поле
Когда я использовал Lucene для индексации своих сущностей, у меня была привычка помещать все мои проиндексированные свойства в поле с именем "all", чтобы выполнять поиск по "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);
Где "scope" - это имя поля индекса (здесь "All"). Если я поставлю чек, как
if( !scopedAnalyzers.ContainsKey( scope ) )
это будет работать довольно хорошо: у меня будет 2 поля для каждого документа "Post", одно с телом, одно с именем. Однако мне нелегко изменить исходный код NHibernate.Search.
Кто-нибудь получил предложение о том, как индексировать различные свойства в одном поле?
1 ответ
Если у вас возникают проблемы с использованием атрибутов Field для указания того, что вам нужно, вы можете создать мост класса, который позволит вам создать свой собственный документ.
просто используйте ClassBridgeAttribute в определении класса и укажите тип, который реализует интерфейс IFieldBridge. Это позволит вам полностью контролировать, как создаются документы Lucene.
Дополнительную информацию можно найти по адресу http://docs.jboss.org/hibernate/stable/search/reference/en/html/search-mapping-bridge.html см. 4.2.2.3. Секция ClassBridge