7
votes

À l'exclusion des éléments de manière sélective de l'indice de recherche Lucene de Sitecore - Fonctionne lors de la reconstruction avec IndexViewer, mais pas lors de l'utilisation des outils intégrés de Sit

sur un site propulsé par SITECORE 6.2, je dois donner à l'utilisateur la possibilité d'exclure de manière sélective des éléments à partir de résultats de recherche.

Pour ce faire, j'ai ajouté une case à cocher intitulée "Inclure les résultats de la recherche", et je Créé un robot de base de données personnalisé pour vérifier la valeur de ce champ: p>

\ \ app_config \ Index Index \ \ Recherche \ website.config: p> xxx pré>

~ \ lib \ Recherche \ Indexing \ CustomCrawler.cs: p>

using Lucene.Net.Documents;
using Sitecore.Search.Crawlers;
using Sitecore.Data.Items;

namespace MyProject.Lib.Search.Indexing
{
  public class CustomCrawler : DatabaseCrawler
  {
    /// <summary>
    ///   Determines if the item should be included in the index.
    /// </summary>
    /// <param name="item"></param>
    /// <returns></returns>
    protected override bool IsMatch(Item item)
    {
      if (item["include in search results"] != "1")
      {
        return false;
      }

      return base.IsMatch(item);
    }
  }
}


2 commentaires

Cross-posté sur SDN à sdn.sitecore.net/sdn5/forum/ Showpost.aspx? Postide = 36196


Je suis généralement plus actif sur le SDN, mais cette fois ressemble à ce que j'ai cherché plus d'attention à votre poste SDN.


3 Réponses :


1
votes

Je pense que j'ai compris une solution à mi-chemin.

Voici un extrait intéressant de sitecore.shell.applications.search.rebuildsearchindex.rebuildsearchindexform.builder.build () code>, qui est invoqué Par l'indice de recherche Réciprocie dans l'application Panneau de configuration: P>

using Sitecore.Data;
using Sitecore.Data.Indexing;
using Sitecore.Diagnostics;

namespace MyProject.Lib.Search.Indexing
{
  public class CustomIndex : Index
  {
    public CustomIndex(string name)
      : base(name)
    {
    }

    public override void Rebuild(Database database)
    {
      Sitecore.Search.Index index = Sitecore.Search.SearchManager.GetIndex(Name);
      if (index != null)
      {
        index.Rebuild();
      }
    }
  }
}


0 commentaires

1
votes

SITECORE 6.2 utilise l'API de recherche ancienne et plus récente, d'où les différences de la manière dont l'index est construit, je crois. CMS 6.5 (prochainement être publié) utilise simplement la nouvelle API - E.G., SITECORE.SEARCH


0 commentaires

4
votes

J'ai parlé avec Alex Shyba hier et nous avons pu comprendre ce qui se passait. Il y avait quelques problèmes de configuration qui empêchaient tout de travailler correctement:

  • Comme Seth notait, il existe deux apistées de recherche distinctes dans Sitecore. Mon fichier de configuration utilisait les deux. Pour utiliser l'API plus récente, SEULEMENT STRY> THE SIDECORE / RECHERCHE / CONFIGURATION CODE> La section doit être configurée (en plus de ce que j'ai posté dans mon op, j'ajoute également des index dans sitecore / index code> et sitecore / bases de données / base de données / index code>, ce qui n'est pas correct). P> li>

  • au lieu de remplacer ismatch () code>, j'aurais dû rechercher additem () code>. En raison de la façon dont Lucene fonctionne, vous ne pouvez pas mettre à jour un document en place; Au lieu de cela, vous devez d'abord la supprimer, puis ajouter la version mise à jour. P>

    Quand sitecore.search.crawlers.databasecrawler.updateItem () code> exécute, il vérifie ismatch () code> pour voir s'il doit supprimer et re-ajouter l'élément. Si ismatch () code> renvoie false, l'élément ne sera pas supprimé de l'index même s'il ne devrait pas être là en premier lieu p>. P>.

    En remplacement addItem () code>, j'ai pu instruire le robotteur si l'élément doit être ajouté à l'index après que ses documents existants avaient déjà été supprimés. Voici ce que la classe mise à jour ressemble à: p>

    ~ \ lib \ recherche \ indexing \ CustomCrawler.cs: p>

    <database id="production">
      <Engines.HistoryEngine.Storage>
        <obj type="Sitecore.Data.$(database).$(database)HistoryStorage, Sitecore.Kernel">
          <param connectionStringName="$(id)" />
          <EntryLifeTime>30.00:00:00</EntryLifeTime>
        </obj>
      </Engines.HistoryEngine.Storage>
      <Engines.HistoryEngine.SaveDotNetCallStack>false</Engines.HistoryEngine.SaveDotNetCallStack>
    </database>
    
    • Le paramètre d'instancename code> est vide, ce qui peut causer des problèmes sur des instances éphémères (Cloud) dans lesquelles le nom de la machine pourrait changer entre exécutions. Nous avons modifié ce paramètre sur chaque instance pour avoir une valeur constante et distincte (par exemple, cms code> et cd code>). P> li>

    • Le paramètre indexing.serverspecificProperties code> doit être true code> de sorte que chaque instance maintient son propre enregistrement de la dernière mise à jour de son index de recherche. P> li>

    • Le paramètre acadréventqueutres code> doit être vrai code> pour empêcher les conditions de course entre les processus d'indexation de la recherche et de cache Flush Processes. P> LI>

    • En cours de développement, le indexing.updateInterval code> doit être réglé sur une valeur relativement petite (par exemple, 00:00:15 code>). Ce n'est pas génial pour les environnements de production, mais il réduit la quantité d'attente que vous ayez à faire lors du dépannage des problèmes d'indexation de la recherche. P> LI>

    • Assurez-vous que le moteur d'historique est activé pour chaque base de données Web, y compris les cibles de publication à distance: P>

      using Sitecore.Data.Items;
      using Sitecore.Search;
      using Sitecore.Search.Crawlers;
      
      namespace MyProject.Lib.Search.Indexing
      {
        public class CustomCrawler : DatabaseCrawler
        {
          protected override void AddItem(Item item, IndexUpdateContext context)
          {
            if (item["include in search results"] == "1")
            {
              base.AddItem(item, context);
            }
          }
        }
      }
      


0 commentaires