Liferay 6.0 – Corriger la recherche de contenu Web par type

Liferay est un portail d’entreprise open-source conçu en Java. Il comporte un grand nombre de fonctionnalités de publication, de gestion de contenu, de documents ainsi que divers composants collaboratifs. Liferay propose également de créer ses propres composants et de redéfinir le comportement et la structure du portail et de ses composants.

En tant que gestionnaire de contenu Web, Liferay offre la possibilité de créer et de rechercher du contenu au sein du portail tout en filtrant les différents contenus en fonction de leur type, que ce soit une page wiki, de blog, une actualité …

La procédure à suivre pour cela est très simple : il suffit de préciser le type d’un contenu créé comme présenté ci-dessous en utilisant la portlet “Web Content Display” :

La portlet de recherche doit ensuite être configurée de la manière suivante afin de pouvoir rechercher du contenu à partir du type de contenu souhaité :

Cependant, je me suis aperçu lors d’une mission qu’une erreur s’était glissée dans la portlet de recherche. En effet, non seulement la recherche retourne les documents de la catégorie attendue mais aussi tous les autres documents du portail. Cette fonctionnalité n’a donc aucunement le comportement attendu.

Cela étant, cette erreur ne concerne que les versions antérieures à la 6.1.0, version où cette erreur a été corrigée.

Pourquoi ?

Regardons comment une recherche de contenu est effectuée. Lors d’une recherche, les mots-clés saisis, “Keywords” et la catégorie des documents recherchés, ici appelée type, sont récupérés sur la page Search.jsp de la portlet “Journal Content Search”. Ces paramètres sont ensuite transmis dans un Contexte de Recherche (SearchContext) et utilisés par un Indexer qui va se charger de retourner les résultats.

1
2
3
4
5
6
Indexer indexer = IndexerRegistryUtil.getIndexer(JournalArticle.class);
SearchContext searchContext = SearchContextFactory.getInstance(request);
searchContext.setAttribute("type", type);
searchContext.setGroupIds(null);
searchContext.setKeywords(keywords);
Hits results = indexer.search(searchContext);

Or, cette recherche ne produit pas le résultat attendu. En effet, bien que le type soit précisé en tant qu’attribut, celui-ci n’est pas récupéré et utilisé par l’Indexer (ici, JournalIndexer).

La logique voudrait que l’on surcharge la fonction Search de la classe JournalIndexer, mais cette manipulation impliquant l’utilisation d’un plugin EXT, nous allons utiliser une méthode alternative.

Pourquoi ne pas utiliser de plugin EXT ?

A la vue des implications qu’engendre l’utilisation d’un plugin EXT, nous allons plutôt utiliser un plugin HOOK. Pour plus d’informations, je vous invite à lire l’article wiki à ce sujet.

Il suffit de créer un plugin HOOK, de modifier la page search.jsp de la portlet Journal Content Search et d’ajouter une condition booléenne (qui doit donc répondre par “true”) au SearchContext :

1
2
3
4
5
6
7
8
9
10
11
12
13
Indexer indexer = IndexerRegistryUtil.getIndexer(JournalArticle.class);
SearchContext searchContext = SearchContextFactory.getInstance(request);
searchContext.setAttribute("type", type);

if(!type.isEmpty()){
BooleanClause clause = BooleanClauseFactoryUtil.create("type", type, "MUST");
BooleanClause[] clauses ={clause};
searchContext.setBooleanClauses(clauses);
}

searchContext.setGroupIds(null);
searchContext.setKeywords(keywords);
Hits results = indexer.search(searchContext);

Ainsi, nous allons récupérer les informations des documents de la catégorie souhaitée uniquement, en incluant, si besoin est, une condition supplémentaire à la recherche.

VN:R_U [1.9.22_1171]
Rating: 0 (from 0 votes)
Share
Ce contenu a été publié dans Java, Outils, Trucs & astuces, avec comme mot(s)-clef(s) . Vous pouvez le mettre en favoris avec ce permalien.

Laisser un commentaire