Développement #33632
Permettre la recherche sur toutes les pages accessibles à l'utilisateur
0%
Description
Dans l'idée de pouvoir indexer les contenus d'un portail agent (qui pourrait contenir une sorte de "base de connaissances"), on pourrait imaginer que la recherche dans les pages soit aussi effectuée sur tous les contenus visibles à un certain rôle. Le nom de ce rôle serait posé dans un settings.
- indexer toutes les pages
- mais pour chaque page, n'y indexer que les cellules qui ne nécessitent pas plus de droits (rôles) que la page elle-même
- et enfin filtrer les résultats : ne présenter que les pages visibles à l'utilisateur qui a lancé la recherche
Files
Associated revisions
History
Updated by Thomas Noël almost 6 years ago
Autre piste plus générique proposée par Benjamin :
La vérification pourrait être faite au moment d'afficher les liens vers les pages de résultat. Autrement dit : on peut tout indexer pourvu qu'avant d'afficher un lien on vérifie que l'utilisateur peut le voir.
Updated by Frédéric Péters almost 6 years ago
- Subject changed from Permette l'indexation des pages qui sont visibles à un certain rôle to Permettre l'indexation des pages qui sont visibles à un certain rôle
Updated by Thomas Noël almost 6 years ago
Note : sur l'idée de Benjamin de tout indexer et de n'afficher que les pages visibles aux rôles de l'usager qui recherche, il faudra en revanche n'indexer pour chaque page que les contenus des cellules qui ne nécessitent pas plus de rôles que la page elle-même.
Updated by Thomas Noël almost 6 years ago
- Subject changed from Permettre l'indexation des pages qui sont visibles à un certain rôle to Permettre la recherche sur toutes les pages accessibles à l'utilisateur
Updated by Thomas Noël almost 6 years ago
Autre idée de Frédéric : peut-être finalement partir sur une indexation des cellules, et donc remonter la liste des cellules filtrées selon leur visibilité par rapport à l'usager demandeur, et à partir de là les pages concernées. Note : se posera sans doute le problème de la pagination des résultats de recherche.
Updated by Stéphane Laget almost 6 years ago
Thomas Noël a écrit :
cellules filtrées selon leur visibilité par rapport à l'usager demandeur, => du user demandeur
Updated by Frédéric Péters about 5 years ago
- File 0001-general-redo-full-text-search-using-querysets-33632.patch 0001-general-redo-full-text-search-using-querysets-33632.patch added
- Status changed from Nouveau to Solution proposée
- Patch proposed changed from No to Yes
Voilà qui refait la recherche en se basant sur des querysets django et plus sur whoosh.
Ça passe par un modèle IndexedCell qui reprend le nécessaire pour permettre les requêtes, il s'agit d'objets qui contiennent à la fois le rendu "recherche" (render_for_search des cellules) et une combinaison des attributs de visibilité de la cellule et de la page associée. Le même modèle est utilisé pour l'indexation des liens vers l'extérieur, ça remplace ExternalLinkSearchItem.
Comme avec whoosh ça passe par une réindexation toutes les heures, pas d'optimisation de ce côté, principalement parce qu'il y a des render_for_search() qui peuvent prendre du temps vu en interrogeant des services externes, du coup je n'ai pas eu envie de risquer ça dans le flux requête/réponse.
Ça pourra assez facilement évoluer pour avoir également une indexation incrémentale plus régulière (il y a un last_update_timestamp dans le modèle pour comparer à celui des pages qui bougeraient). (la commande "cron" de combo passe uniquement une fois par heure pour le moment, il y aurait aussi à la faire évoluer comme dans passerelle, pour avoir d'autres intervalles). (mais j'aimerais à l'occasion discuter de ces tâches asynchrones, qu'on essaie de partager du code entre passerelle et combo pour commencer).
En postgresql ça profite de https://docs.djangoproject.com/en/1.11/ref/contrib/postgres/search/ pour la recherche plein texte, ailleurs ça fait juste un __icontains.
Dans les changements il y a aussi qu'on traite désormais cette recherche comme une recherche interne, alors qu'avant c'était juste une URL de plus, au même niveau que les recherches usager ou démarche, c'est fait pour profiter du request.user qu'on a à ce moment, qu'on perdrait si on on faisait une requête http.
(parce que migrations etc. ça s'applique après la nouvelle cellule "liste de liens", #11006).
Updated by Thomas Noël about 5 years ago
Première passe rapido, ça me parait très bien.
Pour l'indexation horaire on risque juste d'exposer dans les résultats des contenus de cellules qui seraient depuis devenues privées, mais je n'en fais pas quelque chose de bloquant.
Peut-être que sur le calcul du rank on pourrait être un peu plus rusés, car si une page contient trois cellules avec le mot "camion" ça serait bien qu'elle arrive devant la page qui ne l'a que deux fois... Mais ça pourrait être l'objet d'un ticket futur car je n'ai pas tellement de formule de calcul facile à proposer (ça serait genre pagerank = rank_cell_1 + rank_cell_2/2 + rank_cell_3/4 + ... + rank_cell_n/2**n, mais bon, bref bref).
L'attribut last_update_timestamp sur le modèle IndexedCell, il vise quel objectif ?
Updated by Frédéric Péters about 5 years ago
L'attribut last_update_timestamp sur le modèle IndexedCell, il vise quel objectif ?
(je réponds sans avoir relu la branche) ça doit être pour anticiper une mise à jour incrémentale de l'index.
Updated by Thomas Noël about 5 years ago
- Status changed from Solution proposée to Solution validée
Relu, je n'ai rien à ajouter, tout semble ok. Testé en local, l'indexation est ok, la recherche fonctionne bien sur des parties de mot, avec ou sans accent... Pas mal !
Updated by Frédéric Péters about 5 years ago
- Status changed from Solution validée to Résolu (à déployer)
commit 7698d8a398d8b5391e8c8ce76d35edc992a17a8e Author: Frédéric Péters <fpeters@entrouvert.com> Date: Mon Jan 20 16:31:56 2020 +0100 general: redo full text search using querysets (#33632)
Updated by Frédéric Péters about 5 years ago
- Status changed from Résolu (à déployer) to Solution déployée
general: redo full text search using querysets (#33632)