Projet

Général

Profil

Development #33632

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

Ajouté par Thomas Noël il y a presque 5 ans. Mis à jour il y a environ 4 ans.

Statut:
Fermé
Priorité:
Normal
Assigné à:
Début:
03 juin 2019
Echéance:
% réalisé:

0%

Temps estimé:
Patch proposed:
Oui
Planning:
Non

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

Fichiers

Révisions associées

Révision 7698d8a3 (diff)
Ajouté par Frédéric Péters il y a environ 4 ans

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

Historique

#1

Mis à jour par Thomas Noël il y a presque 5 ans

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

Mis à jour par Frédéric Péters il y a presque 5 ans

  • Sujet changé de Permette l'indexation des pages qui sont visibles à un certain rôle à Permettre l'indexation des pages qui sont visibles à un certain rôle
#4

Mis à jour par Thomas Noël il y a presque 5 ans

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

Mis à jour par Thomas Noël il y a presque 5 ans

  • Sujet changé de Permettre l'indexation des pages qui sont visibles à un certain rôle à Permettre la recherche sur toutes les pages accessibles à l'utilisateur
#6

Mis à jour par Thomas Noël il y a presque 5 ans

  • Description mis à jour (diff)
#7

Mis à jour par Thomas Noël il y a presque 5 ans

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

Mis à jour par Stéphane Laget il y a presque 5 ans

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

#9

Mis à jour par Stéphane Laget il y a plus de 4 ans

  • Version cible mis à Wishlist
#10

Mis à jour par Frédéric Péters il y a environ 4 ans

  • Assigné à mis à Frédéric Péters
#11

Mis à jour par Frédéric Péters il y a environ 4 ans

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

Mis à jour par Thomas Noël il y a environ 4 ans

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

Mis à jour par Frédéric Péters il y a environ 4 ans

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

Mis à jour par Thomas Noël il y a environ 4 ans

  • Statut changé de Solution proposée à 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

Mis à jour par Frédéric Péters il y a environ 4 ans

  • Statut changé de Solution validée à 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

Mis à jour par Frédéric Péters il y a environ 4 ans

  • Statut changé de Résolu (à déployer) à Solution déployée

Formats disponibles : Atom PDF