Laurent Kempé
Indexer et rechercher vos entités métier à l'aide du Framework Lucene.Net
Conception à l'aide des génériques et de la réflexion d'un moteur de recherche permettant d'indexer et rechercher du contenu dans des entités métier sans les polluer.
Par Laurent Kempé publié le 12/11/2007 à 00:04, lu 3255 fois, 6 pages
 5 | Intégration de l'indexation dans la couche d'accès
Nous définissons tout d'abord une entité du domaine avec une propriété décorée par l'attribut Searchable :

using System;

using System.Collections.Generic;

using System.Collections.Specialized;

using innoveo.Blog.Domain.Utils;

 

namespace innoveo.Blog.Domain

{

    [Serializable]

    public class Post : IComparable<Post>

    {

        [Searchable]

        public string Content

        {

            get { return content; }

            set { content = value; }

        }

Puis imaginons que notre couche d'accès définisse une classe BlogProvider avec une méthode SearchPosts :

using System.Collections.Generic;

using System.Configuration.Provider;

using innoveo.Blog.Domain;

 

namespace innoveo.Blog.DAL.Blog

{

    public abstract class BlogProvider : ProviderBase

    {

        public abstract Post GetPost(string id);

        public abstract IEnumerable<Post> SearchPosts(string queryString);

La classe EussBlogProvider héritant de la classe BlogProvider implémente les différentes méthodes de notre provider, dans cet exemple à l'aide de l'outil de mapping objet relationnel Euss :

using System;

using System.Collections.Generic;

using System.Text;

using Evaluant.Uss.ObjectContext;

using innoveo.Blog.Domain;

using innoveo.Blog.Domain.Utils;

 

namespace innoveo.Blog.DAL.Blog

{

    public class EussBlogProvider : BlogProvider

    {

        private readonly SearchableRepository<Post, SearchableAttribute> postRepository =

            new SearchableRepository<Post, SearchableAttribute>();

 

        /// <summary>

        /// Searches the posts.

        /// </summary>

        /// <param name="queryString">The query string.</param>

        /// <returns></returns>

        public override IEnumerable<Post> SearchPosts(String queryString)

        {

            return postRepository.Search(queryString, "Content");

        }

Ce qui donne avec l'utilisation de notre Framework d'indexation et de recherche :

/// <summary>

/// Searches the specified query string.

/// </summary>

/// <param name="queryString">The query string.</param>

/// <param name="queryField">The query field.</param>

/// <returns></returns>

public IEnumerable<T> Search(string queryString, string queryField)

{

    List<string> ids = new List<string>(EntitySearcher.Search(queryString, queryField));

 

    return Read(ids.ToArray());

}

Il est à noter que la classe SearchableRepository hérite d'une classe de base Repository. Cette classe de base offre toutes les méthodes CRUD d'accès aux données et est étendue par la classe SearchableRepository à laquelle elle ajoute des fonctionnalités d'indexation et de recherche. Il devient donc évident que la classe SearchableRepository<Post, SearchableAttribute> définie dans la classe EussBlogProvider indexe des entités de type Post décorées par notre attribut.
Enfin la méthode Read est en charge de charger depuis notre entrepôt de données, géré par Euss, les différentes entités correspondant à la requête effectuée.
 
» Démarrer une discussion
 
Discussion démarée par teddyalbina le 24/08/2008 à 11:41, 1 commentaire(s).