chartes / lettres-app

API de l’application Lettres (édition collaborative de correspondances)
1 stars 2 forks source link

Optimisation de la recherche Elasticsearch #95

Open vicpsl opened 1 year ago

vicpsl commented 1 year ago

Lettres, moteur de recherche

Sommaire :

A. État courant de l'application   I. Logique d'indexation et fonctionnement actuel de la recherche1. Filtres2. Recherche plein texte3. Combinaison de Filtres / Recherche plein texte4. Notes importantes concernant la recherche (Mise à jour index, Recherche approximative, Pagination, Cache)   II. Précisions liées au fonctionnement de l'application1. Gestion des droits2. Quantification des Personnes, Lieux et Collections les plus présents dans un résultat de recherche

B. Objet de l'issue : optimisation du moteur de recherche   I. Évaluation de l'existant   1. Réaliser un audit succinct de l'existant afin de :   2. résoudre les points suivants (voir B.II.) et   3. implémenter les solutions (ou assistance à l'implémentation en fonction du temps utile disponible)   II. Points à traiter   1. Amélioration du temps de réponse   2. Prévoir le dépassement de 10K documents dans les résultats de recherche


A. État courant de l'application :

Le moteur de recherche de l'application déployé dans l'application est basé sur Elasticsearch, version "6.8.22". Le moteur de recherche doit permettre de rechercher des documents.

I. Logique d'indexation et fonctionnement actuel de la recherche :

L'implémentation actuelle répond aux besoins suivants :

1. FILTRER les documents à partir de leurs métadonnées, plutôt qu’en fonction d’un motif de recherche plein texte :

Le formulaire de recherche avancé, basé sur les métadonnées des documents, est accessible depuis la page /search de l'application ("Afficher les filtres").

Objectif : Filtrer et lister tous les documents correspondants aux critères de recherche sur la base de leurs métadonnées, par exemple :

Lettres mentionnant une/des personne(s) ET un/des lieu(x) pour une période définie.

Les filtres sont actuellement définis par :

FILTRES Illustrations
- **Dates de temps** : un slider doit permettre de sélectionner l’intervalle entre 2 années. Cf modèle ENCPOS (slider + 2 inputs pour spécifier une date). Ce champs est inclus dans l'index _documents : `creation`. - **Personnes** : *Input* avec autocomplétion pour sélectionner 1 ou + personne(s), avec sélection possible de son(leurs) statut(s) : expéditeur, destinataire ou sujet. La sélection active est affichée sous la forme d’un tag-filtre activé. Ces champs sont respectivement inclus dans l'index _documents : `senders`, `recipients`, `person-inlined`. - **Lieux** : *Input* avec autocomplétion pour sélectionner 1 ou + lieu(x), avec sélection possible de son(leurs) statut(s) : lieu d’expédition, lieu de réception ou sujet. La sélection active est affichée sous la forme d’un tag-filtre activé. Ces champs sont respectivement inclus dans l'index _documents : `location-date-from`, `location-date-to`, `location-inlined`. - **Collections** : **non inclus à l'index**. *Input* avec autocomplétion pour sélectionner une(des) collection(s) / sous-collection(s). La sélection active est affichée sous la forme d’un tag-filtre activé.

:warning: On ne prend PAS en charge l’opérateur 'OU' ; la combinatoire est difficile à appréhender avec autant de filtres. "Lister les lettres en lien avec Henri IV ET Catherine de Médicis" : la collection des lettres où il est question des 2 personnages (et non pas de l’un OU de l’autre).

Exemples de requêtes :

2. Effectuer une RECHERCHE PLEIN TEXTE :

La recherche plein texte est accessible depuis une barre de recherche en tête de page (accessible depuis /home et /search).

Implémentée avec Elasticsearch "Highlighting" elle permet d'obtenir dans la réponse les concordances ("highlighted snippets") :

Objectif : lister tous les documents mentionnant une/des personne(s) ET un/des lieu(x) ET contenant une expression, pour une période définie.

Input pour saisir une chaîne de caractères, recherchée dans : - Transcription, inclus à l'index _documents `transcription`. - Titre, inclus à l'index _documents `title`. - Analyse, inclus à l'index _documents `argument`.

Exemples de requêtes :

3. COMBINER Recherche Plein Texte et Filtres :

Recherche plein texte sur "eschevins" (169 résultats) Plein texte ("eschevins") et Filtre personne = Catherine de Médicis (28 résultats)

4. Notes importantes concernant la recherche :

Mise à jour des index :

Pour la configuration actuelle : voir lettres-app/elasticsearch/ _settings.conf.json, documents.conf.json, persons.conf.json, placenames.conf.json La mise à jour des index est gérée par abstract_facade.py ou via le cli.py.

Recherche Plein Texte Approximative (date d'implémentation à déterminer) :

Pagination : chaque recherche (et l'application de filtres) doit permettre d'obtenir deux types d'informations :

"Tableau" (Id, Date, Titre, Expéditeur, Destinataires) "Déplié" (Id, Date, Titre, Expéditeur, Destinataires, Lieux d'Expédition et de Destination)

II. Précisions liées au fonctionnement de l'application :

1. Gestion des droits :

Le périmètre de la recherche et donc ses résultats varie selon le statut de l'utilisateur : les users connectés recherchent parmi TOUTES les collections et TOUS les documents, les visiteurs non connectés n'accèdent qu'aux documents PUBLIES et les collections qui leurs sont associées.

2. Quantification des Personnes, Lieux et Collections les plus présents dans un résultat de recherche (date d'implémentation à déterminer):

B. Objet de l'issue : Optimisation du moteur de recherche

:warning: La plupart des composants d'affichage des résultats sont implémentés, ils ne nécessiteront éventuellement que des évolutions marginales, concernant surtout la mise à disposition des données sous-jacentes.

I. Évaluation de l'existant :

1. Réaliser un audit succinct de l'existant afin de :

2. résoudre les points suivants (voir II. ci-dessous) et

3. implémenter les solutions (ou assistance à l'implémentation en fonction du temps utile disponible)

II. Points à traiter :

1. Amélioration du temps de réponse :

Notamment le pré-chargement des filtres (inputs à autocomplétion), qui nécessite d'obtenir les ensembles dédoublonnés des personnes, lieux, collections associées à la recherche en cours mais également leur décompte (ex: afficher les 5 personnes les plus fréquentes (et le comptage) pour une recherche donnée, voir A.II.2) par :

2. Prévoir le dépassement de 10K documents dans les résultats de recherche :

La base de donnée est destinée à couvrir plus de 10 000 documents, il conviendra d'implémenter l'API scroll d'ES ou équivalent (rappel ES version "6.8.22") pour pouvoir gérer de tels volumes.

vicpsl commented 1 year ago

Bonjour Vincent,

voici l'issue sur l'amélioration de la recherche ES à passer en revue.

Merci