Projet

Général

Profil

Development #65511

sur une recherche full text, en l'absence de critère de tri, trier par pertinence des résultats

Ajouté par Frédéric Péters il y a presque 2 ans. Mis à jour il y a presque 2 ans.

Statut:
Fermé
Priorité:
Normal
Assigné à:
Version cible:
-
Début:
20 mai 2022
Echéance:
% réalisé:

0%

Temps estimé:
Patch proposed:
Oui
Planning:
Non

Description

Typiquement ça permettra à combo qui appelle /api/cards/whatever/list?q=toto d'obtenir les résultats classés "correctement".


Fichiers


Demandes liées

Lié à w.c.s. - Development #16253: Trier par pertinence les résultats d'une recherche full textFermé10 mai 2017

Actions

Révisions associées

Révision a71e70c7 (diff)
Ajouté par Frédéric Péters il y a presque 2 ans

tests: add basic backoffice form fts search test (#65511)

Révision 97af09ca (diff)
Ajouté par Frédéric Péters il y a presque 2 ans

api/backoffice: order by rank (#65511)

Révision d97880ee (diff)
Ajouté par Frédéric Péters il y a presque 2 ans

misc: use a single sql query to get item ids (#65511)

Révision 10e74275 (diff)
Ajouté par Frédéric Péters il y a presque 2 ans

misc: merge filter and ordering queries (#65511)

Historique

#2

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

Du contexte, sur un appel /api/cards/whatever/list?q=toto

SELECT id FROM carddata_31_whatever WHERE fts @@ plainto_tsquery('toto')

d'où on récupère la liste des id, puis on fera un SELECT ... WHERE id IN (1,3,4,5,6).

En présence d'un order_by, on ajoute entre ces deux étapes une requête

SELECT id FROM carddata_31_whatever ORDER BY le_tri

(où on voit qu'on a perdu le critère de recherche full text, j'ai créé #65525).

L'idée serait, quand order_by n'est pas précisé, et qu'il y a une recherche fts, qu'on ait un tri par pertinence.

Ce qu'on aurait en django d'un façon type qs = Whatever.objects.annotate(rank=SearchRank(vector, query)).order_by('-rank').

Ce travail en deux/trois temps (récup des id, tri des id, récup des données) ne peut pas être réduit à une seule étape (à cause d'une compatibilité ancien stockage pickle), mais on pourrait réduire ça à (récup des id triés, récup des données).

#3

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

mais on pourrait réduire ça à (récup des id triés, récup des données).

C'était mon idée dans #65525 mais non.

Mais je viens de taper un début de branche pour ici, qui fait

+        elif not anonymise and get_publisher().is_using_postgresql() and query:
+            criterias = [FtsMatch(query)] + (criterias or [])
+            ordered_ids = formdata_class.get_sorted_ids(order_by, clause=criterias)

et l'idée serait ici de mettre order_by = 'rank' et que get_sorted_ids se débrouille.

#4

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

  • Assigné à mis à Pierre Ducroquet

Je m'occuperai de la partie code parce qu'il y a pas mal à démêler là-edans mais je veux bien les infos sur les requêtes qui seraient à faire pour un tri par pertinence.

#6

Mis à jour par Pierre Ducroquet il y a presque 2 ans

Niveau SQL y'a rien de bien sorcier, le critère d'order by est le suivant :

ORDER BY ts_rank(fts, to_tsquery('french', 'choucroute')) DESC

Ce qui donne en requête complète:

select id, fts from formdata_42_fete_de_la_saucisse where fts @@ to_tsquery('french', 'choucroute') order by ts_rank(fts, to_tsquery('french', 'choucroute')) desc;

#7

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

  • Assigné à changé de Pierre Ducroquet à Frédéric Péters

top, merci.

#8

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

  • 0001 c'est quelques tests basiques posés avant de développer,
  • 0002 c'est la réalisation minimale, construction d'un ORDER BY ts_rank (ce ticket pourrait s'arrêter ici),
  • 0003 c'est l'idée de réduire les requêtes nécessaires pour la récupération des id, en spécialisant totalement get_listing_item_ids() en cas de stockage postgresql, en passant tous les critères dans une seule requête,
  • 0004 c'est la suite, réduire encore d'une requête, en incluant également le tri dans la requête de récupération des id.
#9

Mis à jour par Lauréline Guérin il y a presque 2 ans

  • Statut changé de Solution proposée à Solution validée
#10

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

  • Statut changé de Solution validée à Résolu (à déployer)
commit 10e74275d62046d3d2ecba91779b5b3294844daf
Author: Frédéric Péters <fpeters@entrouvert.com>
Date:   Sun May 29 12:58:18 2022 +0200

    misc: merge filter and ordering queries (#65511)

commit d97880ee7256071141277acd055b7a1cb2bf829b
Author: Frédéric Péters <fpeters@entrouvert.com>
Date:   Sun May 29 12:31:12 2022 +0200

    misc: use a single sql query to get item ids (#65511)

commit 97af09ca2dcb20e0e199ab6307e2a3b467ee9af2
Author: Frédéric Péters <fpeters@entrouvert.com>
Date:   Fri May 20 15:15:26 2022 +0200

    api/backoffice: order by rank (#65511)

commit a71e70c79366918e2c0091b57033f72b18c4af5c
Author: Frédéric Péters <fpeters@entrouvert.com>
Date:   Fri May 20 14:35:27 2022 +0200

    tests: add basic backoffice form fts search test (#65511)
#11

Mis à jour par Transition automatique il y a presque 2 ans

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

Mis à jour par Transition automatique il y a plus d'un an

Automatic expiration

#13

Mis à jour par Frédéric Péters il y a 11 mois

  • Lié à Development #16253: Trier par pertinence les résultats d'une recherche full text ajouté

Formats disponibles : Atom PDF