Documentation Frappe Framework

Frappe Framework

Recherche SQLite

Orthographe, fraîcheur et score BM25 se combinent. Le HTML est nettoyé. Sans enregistrement du hook, l’index reste manuel.

3 min de lectureMis à jour le Source : docs.frappe.io

Démarrage

SQLiteSearch sert la recherche plein texte FTS5 : correction, score de fraîcheur, classement, filtres de droits. Une autre piste, Whoosh, est dans Recherche plein texte.

Classe dans my_app/search.py. INDEX_NAME est le fichier, par exemple my_app_search.db. INDEX_SCHEMA a metadata_fields et un tokenizer, dans l’exemple unicode61 remove_diacritics 2 tokenchars '-_'. INDEXABLE_DOCTYPES décrit Task et Issue. Task mappe subject vers title et description vers content. Issue ne prend pas les Closed, et mappe last_updated vers modified.

get_search_filters est obligatoire. L’exemple ne renvoie que les projets dont l’utilisateur est propriétaire. Liste vide : {"project": []}, aucun accès.

Hook : sqlite_search = ['my_app.search.MyAppSearch']. Une méthode en liste blanche instancie la classe et appelle search. build_index() construit l’index, en console ou dans le code.

Index et recherche

build_index crée une base temporaire FTS5, lit les DocTypes selon les mappings et filtres, nettoie le HTML avec BeautifulSoup, appelle prepare_document s’il est surchargé, exige title et content, insère par lots, construit le dictionnaire d’orthographe, puis remplace l’ancienne base d’un bloc.

index_doc et remove_doc traitent un document et mettent à jour le vocabulaire.

search appelle get_search_filters, refuse une requête vide, fusionne les filtres, corrige par similarité de trigrammes, interroge FTS5 avec les métadonnées, récupère le BM25, puis booste titre, fraîcheur et fonctions maison, classe, et fabrique des extraits.

Schéma

text_fields par défaut title et content. metadata_fields pour filtrer. Le tokenizer d’exemple plus complet ajoute @..

Une chaîne est un champ direct. Un dictionnaire {"title": "subject"} renomme. title et content sont exigés, ou mappés. doctype et name sont ajoutés. modified sert à la fraîcheur. Pour une autre date, {"modified": "creation"} ou last_updated.

Personnalisation

Administrator peut renvoyer {}. Un autre exemple limite owner et des statuts.

@SQLiteSearch.scoring_function multiplie le score. L’exemple priorité High 1,5, Medium 1,1, sinon 1. Le nom publié est coupé par des astérisques autour de « get » : la méthode est un boost de priorité.

Fraîcheur sur modified : 1,8 sur 24 h, 1,5 sur 7 jours, 1,2 sur 30, 1,1 sur 90, puis une baisse progressive. GP Discussion mappe last_post_at, Article published_date.

prepare_document appelle le parent, peut renvoyer None, et pour Task colle description, notes et commentaires. get_category_for_task est appelé sans être défini dans la page.

« projetc managment » trouve « project management ». summary.corrected_words donne le dictionnaire des corrections.

Le HTML perd balises, scripts, styles et URL. Le texte des liens reste. L’exemple d’article devient un texte plat : documentation d’API, jetons Bearer, 1000 requêtes par heure, méthode POST.

title_only=True ne cherche que les titres. Un filtre liste est un IN, une valeur seule est une égalité.

Automatique ou non

Avec le hook : index après bench migrate, vérification toutes les 15 minutes, index_doc et remove_doc sur insertion, mise à jour et suppression des DocTypes déclarés.

Sans le hook, rien de tout cela. L’exemple enqueue my_app.search.build_index sur la file long si la recherche est activée et que l’index manque. Un scheduler_events daily pointe build_index_if_not_exists, qui n’est pas la fonction définie juste au-dessus.

API

search renvoie results et summary. Une ligne a doctype, name, title, content, score, original_rank (BM25) et rank après le pipeline. Le résumé a duration, totaux, mots corrigés, requête corrigée, title_only, filtered_matches, applied_filters.

build_index, index_doc, remove_doc, is_search_enabled (à surcharger pour couper), index_exists. get_search_filters doit être implémenté. scoring_function est le décorateur.

Point d’attention

Une sous-classe sans get_search_filters n’est pas complète. Le hook et l’exemple manuel de planification ne nomment pas la même fonction.

Recherche plein texte SQLite Frappe | ERPNext Lab