(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; }
}

Но имам хвърлено изключение: „ключът вече присъства в речника“, в ScopedAnalyzer.cs ред 26:

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)


Ако имате проблеми с използването на атрибутите Field, за да посочите какво ви трябва, можете да създадете мост за клас, който ще ви позволи да създадете свой собствен документ.

просто използвайте 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