Project

General

Profile

Development #33632

Permettre la recherche sur toutes les pages accessibles à l'utilisateur

Added by Thomas Noël 10 months ago. Updated about 1 month ago.

Status:
Solution déployée
Priority:
Normal
Start date:
03 Jun 2019
Due date:
% Done:

0%

Patch proposed:
Yes
Planning:
No

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.

Le plan est maintenant :
  • 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

0001-general-redo-full-text-search-using-querysets-33632.patch View (39.3 KB) Frédéric Péters, 22 Jan 2020 10:31 AM

Associated revisions

Revision 7698d8a3 (diff)
Added by Frédéric Péters about 1 month ago

general: redo full text search using querysets (#33632)

History

#1 Updated by Thomas Noël 10 months 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.

#3 Updated by Frédéric Péters 10 months 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

#4 Updated by Thomas Noël 10 months 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.

#5 Updated by Thomas Noël 10 months 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

#6 Updated by Thomas Noël 10 months ago

  • Description updated (diff)

#7 Updated by Thomas Noël 10 months 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.

#8 Updated by Stéphane Laget 10 months ago

Thomas Noël a écrit :
cellules filtrées selon leur visibilité par rapport à l'usager demandeur, => du user demandeur

#9 Updated by Stéphane Laget 9 months ago

  • Target version set to Wishlist

#10 Updated by Frédéric Péters 3 months ago

  • Assignee set to Frédéric Péters

#11 Updated by Frédéric Péters 2 months ago

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).

#12 Updated by Thomas Noël about 2 months 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 ?

#13 Updated by Frédéric Péters about 2 months 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.

#14 Updated by Thomas Noël about 1 month 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 !

#15 Updated by Frédéric Péters about 1 month 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)

#16 Updated by Frédéric Péters about 1 month ago

  • Status changed from Résolu (à déployer) to Solution déployée

Also available in: Atom PDF