3 votes

(N)Hibernate.Search : Indexer différentes propriétés dans un même champ

Lorsque j'utilisais Lucene pour indexer mes entités, j'avais l'habitude de placer toutes mes propriétés indexées dans un champ nommé "all", afin d'effectuer une recherche sur "tous" mes types d'entités.

Maintenant, en utilisant NHibernate.Search, je ne trouve pas comment faire. J'ai essayé ceci :

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

Mais j'ai une exception : "key already present in dictionary", dans ScopedAnalyzer.cs ligne 26 :

scopedAnalyzers.Add(scope, analyzer);

Où "scope" est le nom du champ d'index (ici, "All"). Si je mets un contrôle comme

if( !scopedAnalyzers.ContainsKey( scope ) )

cela fonctionnera très bien : j'aurai 2 champs pour chaque document "Post", un avec le corps, un avec le nom. Cependant, je ne suis pas à l'aise pour modifier le code source de NHibernate.Search.

Quelqu'un a-t-il une suggestion sur la façon d'indexer différentes propriétés dans un seul champ ?

2voto

Andrew Smith Points 1007

Si vous avez des difficultés à utiliser les attributs de champ pour spécifier ce dont vous avez besoin, vous pouvez créer une classe passerelle qui vous permettra de créer votre propre document.

il suffit d'utiliser l'attribut ClassBridgeAttribute sur la définition de la classe et de spécifier un type qui implémente l'interface IFieldBridge. Cela vous permettra de contrôler totalement la façon dont les documents Lucene sont construits.

De plus amples informations sont disponibles à l'adresse suivante http://docs.jboss.org/hibernate/stable/search/reference/en/html/search-mapping-bridge.html voir le point 4.2.2.3. Section ClassBridge

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X