Accueil / Blog / Métier / Archives / Plone - Exclure des dossiers des résultats de recherche

Plone - Exclure des dossiers des résultats de recherche

Par Sylvain Boureliou publié 25/02/2010

Le cas d'utilisation auquel j'ai été confronté

  • L'ensemble des pages de l'ancien site ont été importées dans un dossiers "/archives".
  • Ces documents d'archives doivent rester en statut "publié" pour permettre aux visiteurs provenant des moteurs de recherche de ne pas tomber sur des erreurs 404.
  • L'utilisation du moteur de recherche ne doit pas retourner des documents provenant de "/archives".

Scripts réalisant les recherches dans Plone 3

  • Lors de l'affichage de la page de résultats d'une recherche: CMFPlone/skins/plone_scripts/queryCatalog.py
  • Résultats instannés du "live search": Products/CMFPlone/skins/plone_scripts/livesearch_reply.py ou Products/NuPlone/skins/nuplone_templates/livesearch_reply.py

Solution 1: Utiliser le produit Products.AdvancedQuery

En considérant que le path absolu du répertoire contenant les archives est "/plone/archives", on peut remplacer la recherche classique (dans queryCatalog.py et livesearch_reply.py):

results = catalog(**query)

par une requête AdvancedQuery exluant "/plone/archives":

from Products.AdvancedQuery import Generic
advanced_query = catalog.makeAdvancedQuery(query) & ~ Generic('path','/plone/archives')
results = catalog.evalAdvancedQuery(advanced_query)

Inconvénient de cette solution : ça ne fonctionne pas si vous utilisez collective.solr comme moteur d'indexation.

Solution 2: Utiliser une propriété "search_me" associée à un indexe du portal_catalog

  1. Créer la propriété "search_me" (type booléen) à la racine du site Plone et lui donner la valeur "True".
  2. Créer la propriété "search_me" (type booléen) sur le répertoire "archives" et lui donner la valeur "False".
  3. Créer l'indexe "search_me" (type field) dans le portal_catalog et réindexer le contenu du site.
  4. Modifier queryCatalog.py et livesearch_reply.py pour étendre les recherches effectuéesavec le critère "search_me=True".

Solution 3: Filter manuellement les résultats de recherche

Dans queryCatalog.py et livesearch_reply.py, une fois la recherche effectée, filtrer manuellement en bouclant sur la liste de résultats.

exclude_url = 'http://monsite.com/archives'
filtered_results = []
for el in results:
    if not el.getURL().startswith(exclude_url):
        filtered_results.append(el)

Inconvénient de cette solution : cela impacte les performances lorsque le nombre d'éléments retourné par la recherche est important.

ABONNEZ-VOUS À LA NEWSLETTER !
Voir aussi
Quand le gouvernement australien se dote d'une application faite sous Plomino... Quand le gouvernement australien se dote d'une application faite sous Plomino... 25/07/2013

Le générateur d'application créé par Eric Bréhault est utilisé partout dans le monde ...

PloneConf 2016, un vent nouveau sur Plone PloneConf 2016, un vent nouveau sur Plone 02/11/2016

Résumé de la conférence annuelle sur Plone qui s'est tenue à Boston.

Turning hackability into a use case 27/01/2015

When a CMS does not allow happy hacking anymore, it loses a very valid use case.

collective.z3cform.norobots: a captcha based on questions and answers 15/01/2010

I have released a new captcha widget/field for z3c.form in Plone. Unlike other captcha fields that ...

Plone Unified Installer and ZcxOracleDA 02/12/2010

Trying to setup cx_Oracle and ZcxOracleDA on a Plone/Zope Zeo setup using the Unified Installer ...