Recherche…


Remarques

La recherche Sitecore est basée sur Lucene, offrant la possibilité de créer des capacités de recherche très rapides pour votre site. Au lieu d'interroger une base de données centralisée (telle que la base de données SQL de Sitecore), elle interroge les fichiers d'index Lucene stockés sur le système de fichiers physique du serveur Web. Sitecore fournit une couche d'abstraction par rapport à l'API Lucene.NET, y compris un fournisseur LINQ qui permet d'écrire Lucene pour un processus simple et familier pour les développeurs .NET. Sitecore est livré avec des index standard configurés que vous pouvez étendre ou définir vous-même. Vous pouvez également choisir d'utiliser SOLR; une plateforme centralisée et évolutive construite sur Lucene.

Configuration

Sitecore est livré avec un ensemble d'index standard préconfigurés que vous pouvez étendre ou que vous pouvez définir vous-même. sitecore_master_index & sitecore_web_index sont les plus intéressants pour votre recherche de site. Ce sont les index prédéfinis pour tous vos éléments Sitecore dans l'arborescence de vos bases de données master et web, respectivement. Ils sont configurés pour stocker tous les champs standard d'un élément Sitecore commun à tous les modèles.

Vous pouvez consulter cette configuration de l'index Web standard à cet emplacement: <Your Site>\App_Config\Include\Sitecore.ContentSearch.Lucene.Index.Web.config

Les principaux domaines d’importance de la configuration d’un index sont les suivants:

  • La configuration du champ - Quels champs doivent être stockés dans l'index et comment ils doivent être stockés.
  • La stratégie - Comment et quand l'index doit-il être mis à jour?
  • The Crawler - L'emplacement où l'index peut obtenir ses données Sitecore

Configuration du champ

En regardant dans la configuration sitecore_web_index , vous pouvez voir la référence suivante: <configuration ref="contentSearch/indexConfigurations/defaultLuceneIndexConfiguration" /> . Cela fait référence à un fichier de configuration d'index partagé trouvé ici: <Your Site>\App_Config\Include\Sitecore.ContentSearch.Lucene.DefaultIndexConfiguration.config . Ici, vous pouvez voir tous les champs inclus dans la configuration standard.

Il existe essentiellement deux manières de définir un champ: soit le champ provient directement d'un champ d'élément Sitecore, soit il s'agit d'un champ calculé. Un champ calculé vous permet d'écrire du code pour effectuer des calculs et stocker le résultat dans le champ. Ce code sera exécuté lorsque l'index est créé / mis à jour, pas lorsque l'index est interrogé. Ceci est particulièrement utile si le champ a besoin de stocker des données agrégées, telles que des comptes, etc.

Dans l'élément <fieldMap> , vous verrez les éléments <fieldNames hint="raw:AddFieldByFieldName"> & <fields hint="raw:AddComputedIndexField"> , qui contiennent respectivement les champs directement issus et les champs calculés.

Stratégie

La stratégie de votre index détermine à quel moment votre index est mis à jour. Vous pouvez choisir parmi les options suivantes:

  • OnPublishEndAsynchronousStrategy (onPublishEndAsync) - Lorsqu'un article est publié, l'index sera mis à jour de manière asynchrone.
  • SynchronousStrategy (syncMaster) - Lorsqu'un élément est enregistré, l'index sera mis à jour instantanément et de manière synchrone.
  • IntervalAsynchronousStrategy (intervalleAsyncCore / intervalAsyncMaster) - Vérifier périodiquement les mises à jour d'éléments et mettre à jour l'index de manière asynchrone
  • ManualStrategy - Aucune mise à jour automatique des index. Les index ne seront mis à jour que manuellement (via le panneau de contrôle ou par programme)
  • RebuildAfterFullPublishStrategy (rebuildAfterFullPublish) - Après une publication, l'index sera entièrement reconstruit
  • RemoteRebuildStrategy (remoteRebuild) - Cette stratégie concerne plusieurs instances de Sitecore. Par exemple, si une reconstruction est demandée à partir du serveur de gestion de contenu, les serveurs de diffusion de contenu distants seront abonnés à cet événement et reconstruiront leurs propres index.

Par défaut, l'index principal est configuré en tant que syncMaster . En effet, si vous enregistrez des éléments dans l'éditeur d'expérience et que le rendu de la page affiche les résultats d'un index, vous souhaiterez voir les modifications apportées aux éléments immédiatement dans les résultats. L'index Web est configuré en tant que «onPublishEndAsync», car les index de votre base de données Web ont uniquement besoin d'être mis à jour lorsque des éléments sont publiés à partir de la base de données master sur le Web.

Vous pouvez également combiner plusieurs stratégies. Par exemple, si vous avez des instances Sitecore distinctes pour votre gestion de contenu (CM) et votre diffusion de contenu (CD), il serait judicieux de combiner onPublishEndAsync avec remoteRebuild , afin que les index de CD soient mis à jour lors de la publication un utilisateur déclenche une reconstruction à partir du panneau de commande du serveur CM.

Vous pouvez choisir votre stratégie en utilisant la configuration suivante:

<strategies hint="list:AddStrategy">
    <strategy ref="contentSearch/indexConfigurations/indexUpdateStrategies/onPublishEndAsync" />
</strategies>

Le crawler

Cela vous permet de spécifier l'emplacement des données Sitecore que vous souhaitez indexer. L'index Web a la configuration par défaut suivante:

<locations hint="list:AddCrawler">
    <crawler type="Sitecore.ContentSearch.SitecoreItemCrawler, Sitecore.ContentSearch">
        <Database>web</Database>
        <Root>/sitecore</Root>
    </crawler>
</locations> 

Les deux bits importants sont les éléments <Database> et <Root> . L'élément <Root> vous permet de spécifier la position de départ dans votre arborescence Sitecore que l'index doit indexer. En réalité, vous avez probablement un nœud 'Home' sous le nœud de contenu auquel vous devez faire référence pour indexer uniquement le contenu / les pages plutôt que vos modèles, etc.

Créer un filtre entrant pour la recherche

Le filtre entrant est appliqué lorsque l'élément est ajouté à l'index de recherche et permet de spécifier si l'élément est inclus ou non dans l'index.

Exemples d'utilisation du filtre entrant - n'incluez pas les valeurs standard et les versions précédentes de l'élément dans l'index.

Les filtres entrants sont définis dans la configuration:

<indexing.filterIndex.inbound>
 <processor type="Sitecore.ContentSearch.Pipelines.IndexingFilters.ApplyInboundIndexFilter, Sitecore.ContentSearch"></processor>
</indexing.filterIndex.inbound>  

Mise en œuvre du code:

public class ApplyInboundIndexVersionFilter : InboundIndexFilterProcessor   
{        
    public override void Process(InboundIndexFilterArgs args)       
    { 
        var item = args.IndexableToIndex as SitecoreIndexableItem;

        if (!item.Item.Versions.IsLatestVersion())            
        {                  
            args.IsExcluded = true;            
        }
    }
}

Plus d'exemples et d'informations peuvent être trouvés sur http://www.sitecore.net/learn/blogs/technical-blogs/sitecore-7-development-team/posts/2013/04/sitecore-7-inbound-and-outbound- filtre-pipelines.aspx

Créer un filtre sortant pour la recherche

Le filtre sortant peut être utilisé pour filtrer les résultats de la recherche.

L'un des exemples d'utilisation du filtre sortant consiste à supprimer les éléments auxquels l'utilisateur n'a pas accès à partir des résultats de recherche.

Les filtres sortants sont définis dans la configuration:

<indexing.filterIndex.outbound>
 <processor type="Sitecore.ContentSearch.Pipelines.IndexingFilters.ApplyOutboundSecurityFilter, Sitecore.ContentSearch"></processor>
</indexing.filterIndex.outbound>

Exemple d'implémentation de filtre sortant:

public class ApplyOutboundIndexWorkflowFilter : OutboundIndexFilterProcessor   
{        
    public override void Process(OutboundIndexFilterArgs args)       
    { 
        //You can use args.IsExcluded to remove items from the search results here
    }
}

Plus d'exemples et d'informations peuvent être trouvés sur http://www.sitecore.net/learn/blogs/technical-blogs/sitecore-7-development-team/posts/2013/04/sitecore-7-inbound-and-outbound- filtre-pipelines.aspx

Supprimer toutes les versions précédentes de l'élément dans l'index lors de l'ajout d'une nouvelle version

Par défaut, Sitecore ajoute toutes les versions de l'élément au sitecore_master_index. L'inconvénient est que si les utilisateurs utilisent des flux de travail et ajoutent beaucoup de versions, ils seront tous ajoutés aux résultats de recherche dans l'éditeur de contenu.

Configuration:

<event name="item:versionAdded" >
              <handler type="FilterPatch.Library.ContentSearch.EventHandler, AssemblyName" method="Execute" />
       </event>

Implémentation du gestionnaire

public class EventHandler
    {
        public void Execute(object sender, EventArgs eventArgs)
        {
            var item = Event.ExtractParameter(eventArgs, 0) as Item;

            //If item has less than 2 versions - then skip
            if(item.Versions.Count < 2)
            {
                return;
            }

            var indexableItem = new SitecoreIndexableItem(item);

            var index = ContentSearchManager.GetIndex(indexableItem);

            using (var context = index.CreateDeleteContext())
            {
                foreach(var version in item.Versions.GetVersions(true))
                {
                    if(!version.Versions.IsLatestVersion())
                    {
                        var indexableItemVersion = new SitecoreIndexableItem(version);
                        context.Delete(indexableItemVersion.UniqueId);
                    }
                }
                context.Commit();                
            }
        }
    }


Modified text is an extract of the original Stack Overflow Documentation
Sous licence CC BY-SA 3.0
Non affilié à Stack Overflow