sql: new FTS mechanism with fuzzy match #1201
Open
pducroquet
wants to merge 3 commits from
wip/86527-better-fts
into main
pull from: wip/86527-better-fts
merge into: entrouvert:main
entrouvert:main
entrouvert:wip/47894-get_table_column
entrouvert:wip/90093-classtype
entrouvert:wip/44887-backoffice-submission-user-roles
entrouvert:wip/90091-image-size-type
entrouvert:hotfix/v11.41
entrouvert:wip/90085-empty-roles-as-list
entrouvert:wip/87739-clamav-cli
entrouvert:wip/89988-postgresql-more-indexes
entrouvert:wip/60412-dynamic-prefill-select2-card
entrouvert:wip/89921-create-list-with-fixed-length
entrouvert:wip/86903-fts-cards
entrouvert:wip/84136-passage-a-nox
entrouvert:wip/89412-global-interactive-no-live
entrouvert:wip/80462-stats-enlever-le-choix-Tous-les-
entrouvert:wip/89601-testdef-support-de-session-user
entrouvert:wip/89640-testdef-inclure-dans-l-applifica
entrouvert:wip/89694-testdef-snapshots-pour-les-utili
entrouvert:wip/89284-email-threading
entrouvert:hotfix/v11.26
entrouvert:wip/75162-do-not-save-prefill-first-visit
entrouvert:wip/81260-workflow-in-progress
entrouvert:hotfix/v11.13
entrouvert:wip/81831-remove-parametric-workflow-variables
entrouvert:wip/88687-update-relations-once-per-model
entrouvert:wip/76958-a11y-live-validation
entrouvert:wip/46617-map-field-jsonb
entrouvert:wip/88208-tests-hobo-provision-clean
entrouvert:wip/4794-mark-vhost-name
entrouvert:wip/87739-clamav
entrouvert:wip/87690-backoffice-builtin-select-filters
entrouvert:hotfix/v10.81
entrouvert:wip/87525-marqueur-position-initiale
entrouvert:wip/72793-french-mobile-number-templatetag
entrouvert:wip/36626-html-form-details
entrouvert:wip/87435-submission-index-query
entrouvert:wip/87434-Ameliorer-les-requetes-dans-Subm
entrouvert:wip/xxxxx-lazy-publication-attributes
entrouvert:wip/86992-Condition-de-sortie-de-page-ne-p
entrouvert:wip/28236-age-in-partial-days
entrouvert:wip/83593-testdef-socle-de-base-pour-les-w
entrouvert:wip/86587-testdef-inclure-les-tests-dans-l
entrouvert:hotfix/v10.71
entrouvert:wip/xxx-failing-tests-1
entrouvert:wip/xxx-failing-tests-2
entrouvert:wip/86587-testdef-inclure-les-tests-dans-l-old
entrouvert:wip/86490-opacify-short-url
entrouvert:83593-old-2
entrouvert:hotfix/v10.63
entrouvert:wip/86224-no-godo-for-loops
entrouvert:wip/27992-history-comment-rich
entrouvert:wip/75777-Doublon-d-utilisateur-au-provisi
entrouvert:wip/83593-testdef-socle-de-base-pour-les-w-old
entrouvert:wip/84500-fausse-exception-None-dans-les-t
entrouvert:wip/41460-workflow-zoom-with-ctrl
entrouvert:wip/tests-jenkins
entrouvert:wip/85108-gin-indexes
entrouvert:hotfix/v10.48
entrouvert:wip/50829-sql-schema
entrouvert:wip/84579-jenkinsfile-double-numprocesses
entrouvert:wip/test-ci
entrouvert:wip/78777-template-data-source
entrouvert:wip/81734-rewrite-stats-in-sql
entrouvert:wip/74723-last-jump
entrouvert:wip/66067-admin-permissions-check-all
entrouvert:wip/79738-role-usage
entrouvert:wip/81105-tests-unitaires-js
entrouvert:wip/81496-application-diff-version
entrouvert:wip/77911-decimal-queries
entrouvert:wip/80843-unicite-identifiant
entrouvert:wip/73401-longueur-champ-text
entrouvert:wip/81020-clamp
entrouvert:hotfix/v9.94
entrouvert:wip/80613-visited-objects
entrouvert:wip/80360-form-details-titles
entrouvert:wip/59221-import-none-role
entrouvert:wip/79858-has-role-filter-uuid
entrouvert:wip/79859-liste-image-live-update-champ-ignore
entrouvert:wip/79775-tox-v4-compat
entrouvert:tmp-paul/godo-dependency-riddance
entrouvert:hotfix/v9.68
entrouvert:hotfix/v9.58
entrouvert:wip/72091-remove-python-option
entrouvert:hotfix/v9.36
entrouvert:hotfix/v9.21
entrouvert:wip/75724-live-validation-js
entrouvert:wip/75724-error-template-markup
entrouvert:wip/75724-JS-live-validation
entrouvert:wip/75170-testdef-revoir-la-creation
entrouvert:wip/75795-sql-application_name
entrouvert:wip/75647-cron-ne-pas-bloquer-sur-une-erre
entrouvert:hotfix/v8.98
entrouvert:wip/75178-Retirer-l-application-d-ExifRest
entrouvert:hotfix/v8.90
entrouvert:wip/74840-tox-30
entrouvert:wip/74840-tox-31
entrouvert:wip/73674-sql-cleanup
entrouvert:wip/74435-show-max-file-size-in-error
entrouvert:wip/check-pylint-broad-exception-raised
entrouvert:wip/xxxxx-native-form-pages
entrouvert:wip/73860-enforce-phone-fr-validation
entrouvert:wip/73513-audit-reduce-default-retention-delay
entrouvert:hotfix/v8.68
entrouvert:wip/72989-testdef-gerer-les-pages-conditio
entrouvert:wip/69561-page-title
entrouvert:wip/72704-testdef-verifier-la-validation-d
entrouvert:wip/72802-wf-actions-tracing-table
entrouvert:wip/72860-geojson-missing-id_property
entrouvert:wip/72862-i18n-none-template
entrouvert:wip/70508-missing-edited-data
entrouvert:wip/71789-empty-supported-languages
entrouvert:wip/72859-recreate-formdef-indexes
entrouvert:wip/72857-call-command-close-conn
entrouvert:wip/72682-grep-backoffice-fields
entrouvert:wip/72851-anonymised-tz
entrouvert:wip/38269-adapt-some-category-slugs
entrouvert:wip/72819-myspace-redirect
entrouvert:wip/72815-steps-title
entrouvert:wip/71590-translate-card-digests
entrouvert:wip/61416-cards-fields-directory
entrouvert:wip/72809-stub-data-source
entrouvert:wip/71020-anonymisation-as-trigger-date
entrouvert:wip/72083-add-deprecated-to-python-labels
entrouvert:wip/72803-snapshot-no-changes
entrouvert:wip/72801-jsonvalue-migration-exceptions
entrouvert:wip/71455-move-form-tokens-to-database
entrouvert:wip/72096-datasource-jsondef
entrouvert:wip/72765-phone-number-prefill
entrouvert:wip/31201-redirect-as-endpoint
entrouvert:wip/67090-saml-lier-la-session-en-cours-a-
entrouvert:wip/xxx-track-possible-regression
entrouvert:wip/72623-native-home-anyformdata
entrouvert:wip/71937-add-json-output-in-inspect-tool
entrouvert:hotfix/v8.54
entrouvert:wip/39178-history-message-template
entrouvert:wip/XXX-optimize-condition
entrouvert:wip/71471-fullname-vs-hobo
entrouvert:wip/XXXXX-test-jumps
entrouvert:wip/71330-api-include-workflow-data-param
entrouvert:wip/71333-lazy-evolution-and-old-pickles
entrouvert:wip/71327-redirect-query-string-trailing-slash
entrouvert:wip/71316-redirect-to-correct-category
entrouvert:wip/71303-api-fix-include-evolution
entrouvert:wip/69108-api-formdata-split-full
entrouvert:wip/71252-wscall-deps-conditions
entrouvert:wip/71152-api-export-import-category
entrouvert:wip/71184-preview-redirection
entrouvert:wip/71183-preview-redirection
entrouvert:wip/71183-edit-backoffice-redirection
entrouvert:wip/71176-summary-display-labels-as-p
entrouvert:wip/71102-timetable-a11y-focus-on-week-change
entrouvert:wip/71103-timetable-a11y-keyboard-nav
entrouvert:wip/71101-timetable-a11y-week-nav-buttons
entrouvert:wip/71091-evolution-metadata-p-tag
entrouvert:wip/71118-post-same-slug
entrouvert:wip/71087-filename-p-tag
entrouvert:wip/71051-edit-with-category
entrouvert:wip/70259-import-submission-channel
entrouvert:wip/71038-backoffice-data-admin-url
entrouvert:wip/71034-fullname-template
entrouvert:wip/70952-get-cron-status-no-lock
entrouvert:wip/4281-use-filewidget-in-export-to-model-action
entrouvert:wip/70045-ignore-anonymised-formdata-in-jumps
entrouvert:wip/70639-order-filter-options
entrouvert:wip/70990-restricted-api-user-substvars
entrouvert:wip/70458-create-doc-section
entrouvert:wip/70576-add-action-types-to-deprecation-page
entrouvert:wip/70978-not-set
entrouvert:wip/70979-fix-distance-filter-templatetags
entrouvert:wip/68883-go-to-mail-template
entrouvert:wip/70773-tempfile-link-on-edit-card
entrouvert:wip/70931-api-geojson-no-result
entrouvert:wip/70949-a-in-rich-text
entrouvert:wip/70858-mail-template-category-in-create
entrouvert:wip/70772-fix-json-import-bad-user-format
entrouvert:wip/70644-fix-get-int-or-404
entrouvert:wip/70914-tracing-members
entrouvert:wip/70904-pgpassword
entrouvert:wip/70908-cron-setproctitle
entrouvert:wip/70907-cron-legacy-needed
entrouvert:wip/70906-meta-unique-index
entrouvert:wip/70000-wf-edit-carddata-evolution-bis
entrouvert:wip/70898-missing-card-custom-view-redirect
entrouvert:wip/70702-api-export-import-set-categories
entrouvert:wip/69375-api-export-import-cards-forms-objects-dependencies
entrouvert:wip/69441-api-export-import-wscall-dependencies
entrouvert:wip/62800-formdata-snapshot-bis
entrouvert:wip/70853-remove-static-pages-support
entrouvert:wip/70606-api-export-import-redirect-url
entrouvert:wip/70685-parallel-cron
entrouvert:wip/70587-dedup-sms
entrouvert:wip/70575-add-field-types-to-deprecation-page
entrouvert:wip/69546-redirect-form-to-url-with-category-bis
entrouvert:wip/69546-redirect-form-to-url-with-category
entrouvert:wip/test-formdata-snapshot-show-diffs
entrouvert:wip/67283-L-affectation-d-un-id-inconnu-a-
entrouvert:hotfix/v8.17
entrouvert:wip/xxxxx-responses-as-mock-library
entrouvert:wip/68413-sql-simplify-fields-used-items
entrouvert:wip/68324-custom_view-2
entrouvert:wip/27991-rich-hints
entrouvert:hotfix/v8.4
entrouvert:wip/64499-computed-field-only-cards
entrouvert:wip/67843-itemsfield-with-none-prefill
entrouvert:wip/clean-more-pickle-code
entrouvert:wip/59052-prefill-items
entrouvert:wip/xxxxx-flex-backoffice
entrouvert:wip/xxxxx-api-perfs
entrouvert:hotfix/v7.93
entrouvert:wip/65104-texte-riche-pour-le-message-d-er
entrouvert:wip/xxxxx-transient-data-table
entrouvert:hotfix/v7.87
entrouvert:wip/api-prefetch-users-and-roles
entrouvert:wip/sql-get-listing-item-ids
entrouvert:wip/check-test-admin-pages-sql-mode
entrouvert:wip/64768-fix-dynamic-internal-id-filter
entrouvert:wip/64260-disable-table-fields
entrouvert:misc/id-matching
entrouvert:wip/62760-block-remove-label
entrouvert:wip/62919-block-remove-row
entrouvert:wip/56640-add-informative-pages-into-summary
entrouvert:wip/63038-extend-error-messages-with-examples
entrouvert:wip/62750-a11y-all
entrouvert:hotfix/v7.46
entrouvert:wip/62344-clean-snapshot-models-check-usage
entrouvert:hotfix/v7.42
entrouvert:wip/61728-computed-and-field-position
entrouvert:wip60469-index-gin-for-arrays
entrouvert:wip/60611-fix-computed-field-with-lazylist
entrouvert:wip/58884-agendas-datasource
entrouvert:wip/58208-formulaire-un-autosave-peut-se-t
entrouvert:wip/60025-wscall-allow-empty-parameter-values
entrouvert:wip/59914-do-not-trace-skipped-jumps
entrouvert:wip/xxxxx-do-no-reload-empty-evolution
entrouvert:wip/59683-fix-test
entrouvert:wip/try-to-fix-test
entrouvert:hotfix/v7.17
entrouvert:wip/58632-allow-empty-values-on-create-formdata
entrouvert:wip/43614-move-post-formdata-to-advanced-wscall-options
entrouvert:wip/56802-remove-display-exception-settings
entrouvert:wip/57066-filter-by-on-list-of-dicts
entrouvert:wip/pin-pylint
entrouvert:wip/56205-La-recherche-sur-un-champ-date-e
entrouvert:wip/55494-card-summary-status
entrouvert:wip/pylint-too-many-xxx
entrouvert:hotfix/v6.66
entrouvert:wip/users-in-functions
entrouvert:hotfix/v6.62
entrouvert:hotfix/v6.54
entrouvert:wip/get-roles-translation-refactor-to-list
entrouvert:wip/tests-close-files
entrouvert:hotfix/v6.33
entrouvert:wip/pylint-no-init-hook
entrouvert:wip/pylint-more
entrouvert:hotfix/v6.27
entrouvert:hotfix/v6.18
entrouvert:hotfix/v6.7
entrouvert:wip/jenkins-check-black
entrouvert:hotfix/v5.96
entrouvert:wip/49538-wscall-record-errors-more-more
entrouvert:hotfix/v5.84
entrouvert:hotfix/v5.75
entrouvert:wip/48678-add-items-options-for-radio
entrouvert:hotfix/v5.70
entrouvert:hotfix/v5.51
entrouvert:wip/46617-map-data-as-dictionary
entrouvert:wip/setuptools
entrouvert:wip/admin-tests-split
entrouvert:hotfix/v5.24
entrouvert:hotfix/v5.18
entrouvert:wip/widget-list
entrouvert:wip/transfer-form-value
entrouvert:wip/readonly-validation
entrouvert:hotfix/v5.6
entrouvert:wip/43384-jump-compute-timeout-errors
entrouvert:wip/django-22
entrouvert:hotfix/v4.56
entrouvert:wip/latest-pylint
entrouvert:hotfix/v4.46
entrouvert:wip/alternate-file-storage
entrouvert:hotfix/v4.40
entrouvert:wip/38852-Evaluation-live-des-formulaires-
entrouvert:wip/python3-part2
entrouvert:hotfix/v4.22
entrouvert:wip/36752-fc-attr-verification-bypassed
entrouvert:wip/36037-datasource-notype
entrouvert:hotfix/v4.2
entrouvert:wip/31942-wipe-exclude
entrouvert:wip/checkboxes-tpl
entrouvert:wip/django
entrouvert:wip/future
entrouvert:wip/misc-fred
entrouvert:wip/json-with-files-content
entrouvert:wip/alfortville
entrouvert:debian-squeeze
entrouvert:debian-wheezy
entrouvert:qommon-for-authentic1
entrouvert:v2012.3
No reviewers
Labels
Clear labels
No items
No Label
Milestone
Clear milestone
No items
No Milestone
Assignees
Clear assignees
No Assignees
3 Participants
Notifications
Due Date
The due date is invalid or out of range. Please use the format 'yyyy-mm-dd'.
No due date set.
Dependencies
No dependencies set.
Reference: entrouvert/wcs#1201
Reference in New Issue
No description provided.
Delete Branch "wip/86527-better-fts"
Deleting a branch is permanent. Although the deleted branch may continue to exist for a short time before it actually gets removed, it CANNOT be undone in most cases. Continue?
3 parts in this work:
wcs_tsquery
function to replaceplainto_tsquery
and do a fuzzy-match of the requested words agains wcs_search_tokens (with a priority on full match obviously)@ -1679,0 +1728,4 @@
$function$;""")
# Second part : insert and update triggers
cur.execute("CREATE OR REPLACE TRIGGER wcs_all_forms_fts_trg_ins AFTER INSERT ON wcs_all_forms FOR EACH ROW WHEN (NEW.fts IS NOT NULL) EXECUTE PROCEDURE wcs_search_tokens_trigger_fn();")
J'ai bien noté que c'était encore WIP mais point d'attention quand même, le ticket en question (/api/formdefs) concerne les démarches (formdef, indexées via SearchableFormDef), pas les demandes (formdata).
Mais il sera bien d'avoir quelque chose de générique, qui pourra s'appliquer à l'ensemble des demandes (wcs_all_forms) mais aussi sur les tables de demandes par formulaire (
formdata_*
) et les tables des fiches (carddata_*
).Merci pour ce point, c'est bien noté.
C'était beaucoup plus simple pour moi de commencer par les demandes que par les démarches. La grosse partie est surtout dans le commit 3, et elle est indépendante. Une fois que cette base fonctionnera, j'y ajouterai les démarches.
c84d2c2e65
to768174fb85
8a7301f810
tod40f540a00
d40f540a00
to0807aaa1ca
0807aaa1ca
tod3a1dd3a6f
d3a1dd3a6f
tob6fbb639ec
b7fdbd4c32
to01f74d5c4b
88c718424b
tof80aa275b5
f80aa275b5
to5ac8da9b4e
5ac8da9b4e
to900ebf1d06
WIP: wip/86527-better-ftsto sql: new FTS mechanism with fuzzy matchIl faudrait quand même un peu de tests pour montrer ce que ça change / que ça marche mieux.
a9f810689b
to17ac728f78
J'ai intégré un test pour SearchableFormdef déjà (en reconstruisant l'historique pour qu'on voit bien le test arriver en échec, puis le reste du code qui corrige l'échec).
Ça correspond donc au test des triggers et de la fonction de recherche. Je dois voir encore pour tester la méthode du cron
45a7ccf97b
tofc6e252770
fc6e252770
to627f5a6f12
Et maintenant avec en plus un test de la purge et de l'indexation des formdata.
@ -703,2 +708,4 @@
CronJob(cls.clean_loggederrors, hours=[3], minutes=[0], name='clean_loggederrors')
)
cls.register_cronjob(
CronJob(cls.clean_search_tokens, weekdays=[0], hours=[1], minutes=[0], name='clean_tokens')
name='clean_search_tokens' donnera un peu de cohérence.
Corrigé, merci
627f5a6f12
to56fb3fb2fc
56fb3fb2fc
to0843793ac3
@ -97,2 +97,4 @@
def _table_exists(cur, table_name):
cur.execute('SELECT 1 FROM pg_class WHERE relname = %s;', (table_name,))
Je profite de l'occasion pour demander le sens des point-virgules en fin de ligne; ça n'est pas quelque chose que je mettais, est-ce important ?
Vieille habitude de ma part, ça ne change rien normalement, je peux le virer si tu préfères.
Non ok pour moi, j'étais juste curieux de peut-être un effet.
@ -1679,3 +1696,4 @@
cur.close()
def init_search_tokens(conn=None, cur=None):
Ça m'irait bien d'avoir ici un récapitulatif du fonctionnement, les tables/triggers/fonctions créées, comment les choses s'agencent et pour quel résultat.
Fait, je te laisse juger, avec la tête dans le guidon c'est plus dur de réaliser si la documentation est complète ou non.
@ -1682,0 +1730,4 @@
tokenized as (select unnest(regexp_split_to_array($1, '\s+')) w),
super_tokenized as (
select w,
coalesce((select plainto_tsquery(perfect.token) from wcs_search_tokens perfect where perfect.token = plainto_tsquery(w)::text),
Je suis toujours perdu par la lecture ici, la forme raccourcie pour renommer la table, ça marcherait pareil (je pense) et plus clair pour moi si c'était wcs_search_tokens AS perfect.
Peut-être plus généralement décrire la requête, et ça rejoint peut-être le point plus haut, si je comprends bien c'est "perfect" pour "perfect match" (ce que je capte en voyant plus bas "partial"), mais ça ne m'éclaire pas totalement sur ce qui est fait.
Fait, idem, n'hésite pas si y'a besoin de plus d'éléments.
@ -5121,3 +5281,3 @@
# programmaticaly but will make sure git conflicts if two migrations are
# separately added with the same number)
SQL_LEVEL = (106, 'add context column to logged_errors table')
SQL_LEVEL = (107, 'improved fts method')
j'aime bien garder le même commentaire ici et plus bas dans le migrate(), donc plutôt "new fts mechanism with tokens table". (et numéro à incrémenter).
0843793ac3
to171ade9840
171ade9840
toaf28be9910
@ -1682,0 +1740,4 @@
# And last: functions to use this brand new table
# These two aggregates make the search query far simpler to write
cur.execute('CREATE OR REPLACE AGGREGATE tsquery_agg_or (tsquery) (sfunc=tsquery_or, stype=tsquery);')
cur.execute('CREATE OR REPLACE AGGREGATE tsquery_agg_and (tsquery) (sfunc=tsquery_and, stype=tsquery);')
Je crois totalement que ça rend l'affaire plus simple à écrire mais je ne trouve pas de référence à tsquery_or dans la documentation de postgresql. Peut-être que ça serait utile d'expliciter ici en commentaire ce que font tsquery_agg_or et tsquery_agg_and.
Documentation améliorée avec info sur l'origine des fonctions dans PG, dis moi si c'est mieux
@ -1682,0 +1758,4 @@
tsquery_agg_or(plainto_tsquery(partial.token) order by partial.token <-> w desc),
plainto_tsquery(w)) tokens
FROM tokenized
LEFT JOIN wcs_search_tokens AS partial ON partial.token % w AND w not similar to '%[0-9]{2,}%'
Ok, donc sur un formdef ("Intervention du service hygiène, salubrité et environnement lorem ipsum plop plop plop") qui a été indexé avec :
Il y a un match sur hien j'imagine parce que hygien, parce que match "partial", qui se voit ainsi :
Je n'ai pas trouvé de description de l'opérateur % dans la documentation de postgresql. (pas le caractère le plus facile à chercher, certes).
Sinon dans le code je n'arrive pas à suivre ce qu'est w, je n'arrive même pas à dire si c'est tout le temps la même chose. J'encouragerais à allonger un peu le nom de cette variable, par exemple si c'était "token" tout le temps (si ça a du sens) ça pourrait être plus clair, modulo confusion avec le nom de la colonne, donc allonger encore, searched_token.
À reprendre pour essayer de comprendre comment tout ça fonctionne, je n'explique pas ceci, toujours ma démarche "Intervention du service hygiène, salubrité et environnement ..."
mais
vs
(l'indexation et la recherche lancée depuis wcs ramènent à de l'ascii, cf FtsMatch.get_fts_value())
En suivant, ça semble venir du dernier cas ("otherwise..."), plainto_tsquery(w), qui serait appelé avec "salubrit", ce qui le raccourcit à nouveau et tombe sur
Je ne sais que faire de tout ça mais j'espère que ça peut t'aider à voir quelque chose.
J'ai corrigé le w en word dans la requête, pour ne pas confondre avec un token de recherche justement (c'est avant la transformation finalement), et supprimé un order by inutile en l'état. J'ai ajouté un lien vers la documentation de pgtrgm pour l'opérateur %.
Concernant ton problème, je n'arrive pas à le reproduire, je cherche
@ -1682,0 +1798,4 @@
):
# Second part: insert and update triggers for wcs_all_forms
cur.execute(
"""CREATE TRIGGER wcs_all_forms_fts_trg_ins
À regarder le commit dans mon terminal je vois qu'il y a des lignes qui comme celle-ci se terminent par un caractère espace; il faudrait les retirer. (j'imagine qu'on pourrait trouver un hook pre-commit pour assurer ça).
af28be9910
toac48ebb70d
ac48ebb70d
tofcdc2581ca
fcdc2581ca
to5cdb00e496
Un truc a du changé, la recherche sur "tes" ne trouve plus :
(je notais juste l'erreur jenkins, je n'ai pas encore regardé les changements)
5cdb00e496
to614ff32a23
6bc9588111
to7baeb009d4
7baeb009d4
to89a165c975
2bc52f9ccd
to4bd581c32b
Il m'a fallu beaucoup de temps pour trouver ce qui causait cette régression pour jenkins et pas en local. Ce test est malheureux puisque "tes" est considéré comme un stop-word sur le dictionnaire français de postgresql. Donc un plainto_tsquery('tes') renvoie '', j'ai corrigé en passant sur le dictionnaire 'simple' pour la recherche de similarités.
Je viens de mettre à jour la branche locale et je tombe toujours sur le même comportement; alors qu'il y a un token "salubrit" dans wcs_search_tokens,
select wcs_tsquery('salubrite');
retourne 'salubr', ce qui fait qu'une recherche de "salubrité" ne trouve pas le formdef qui a salubrité dans son nom (puisque dans sa colonne fts de searchable_formdefs c'est 'salubrit' qui s'y trouve).Je ne sais pas ce qui pourrait aider dans comme description, pour reproduire, mais je viens d'ajouter un commit dans la branche, qui échoue aussi sur jenkins. (et qui fonctionne appliqué sur main).
Merci bien, en fait le problème est bien plus profond que ça, le code actuel casse complètement la mécanique de FTS donc je vais voir pour implémenter le même fonctionnement que l'existant, mais je ferai un autre ticket pour détailler le problème. En très court, le code actuel casse FTS en retirant tous les accents car le dictionnaire intégré au FTS s'effondre...
Exemple rapide et idiot : avec FTS, écolier et écolière sont le même mot normalement, mais sans les accents...
aa2c7b3fe8
to71a1489c88
J'ai mis à jour la branche en incorporant ton test, qui me semble important à garder pour l'avenir, directement dans les tests du FTS.
Dans mon développement, je partais du principe que plainto_tsquery(plainto_tsquery('bidule')::text) était égal à plainto_tsquery('bidule'), ce qui n'est pas le cas quand on sort du dictionnaire avec le unaccent.
Donc je n'ai eu qu'à retirer cette supposition et la remplacer par un cast direct pour régler le problème.
71a1489c88
tod5036ed141
02b9ecf665
to6b0108f527
6b0108f527
to9d8efbda51
5d8ceee958
to4c2278fdaa
4c2278fdaa
to7dc8fe49b7
7dc8fe49b7
to817875d6cb
817875d6cb
toaec7181a78
Passons ça ainsi.