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> ~ \ 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);
}
}
}
3 Réponses :
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();
}
}
}
}
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 P>
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, au lieu de remplacer Quand En remplacement ~ \ lib \ recherche \ indexing \ CustomCrawler.cs: p>
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, Le paramètre Le paramètre En cours de développement, le Assurez-vous que le moteur d'historique est activé pour chaque base de données Web, y compris les cibles de publication à distance: P>
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>
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>
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>.
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>
<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>
cms code> et
cd code>). P> li>
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>
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>
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>
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);
}
}
}
}
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.