Recherche globale de type 'contains'

Request description

Bonjour,

Nous avons un champ identifiant indexé de type ‘IRN-XXXXX’.
La recherche globale fonctionne si on cherche IRN-XXXXX mais pas si on cherche seulement XXXXX.
J’ai trois questions :

  • l’utilisation de wildcard sur le début d’un terme impacterait-elle trop les performances ?
  • sinon, est-ce paramétrable sans évolution ?
  • et sinon, est-ce que créer un champ caché indexé de cet identifiant sans le ‘IRN-’ serait une bonne solution de contournement ?

Merci d’avance,
Emmanuelle

Quelle base de données est utilisée sur cette instance ?

Je pose la question car les capacités et les syntaxes avancées de la recherche fulltext varie selon la base.

C’est une base POSTGRESQL.
J’ai un résultat si je saisis ‘IRN-XXXXX’ ou ‘-XXXXX’ et rien si je saisis seulement ‘XXXXX’.
La requête générée avec ‘XXXXX’ est la suivante

SELECT idx_ukey, idx_object, idx_row_id, idx_ukey, idx_all, CAST(to_tsvector('simple',idx_ukey) @@ to_tsquery('60347:*') as integer)*10 + CAST(to_tsvector('simple',idx_all) @@ to_tsquery('60347:*') as integer) as score FROM m_index WHERE (to_tsvector('simple',idx_ukey) @@ to_tsquery('60347:*') or to_tsvector('simple',idx_all) @@ to_tsquery('60347:*')) AND idx_object IN ('Action','Adapter','Agenda','BPMActivity','BPMAlert','BPMAlertContent','BPMData','BPMHelp','BPMProcess','BPMRecipient','BPMState','BPMStateTransition','ConstraintObject','CronTable','Crosstab','DataMap','Disposition','DocIndex','DocIndexField','DocMIME','DocumentSystem','Domain','Field','FieldList','FieldListValue','FieldStyle','Function','Group','ISOCountry','ISOCtyGrp','Link','ListOfValue','Map','ModelTemplate','Module','ObjectCtxHelp','ObjectExternal','ObjectFieldArea','ObjectFieldSystem','ObjectInternal','ObjectSystem','PlaceMap','PrintTemplate','Profile','RciAppDomain','RciApplication','RciApplicationType','RciBceDomain','RciData','RciDbms','RciDomain','RciFlowModality','RciFunctDomain','RciLDAP','RciMacroprocess','RciNetworking','RciProvider','RciResponsibleEntity','RciRetentionTime','RciSecurityAuth','RciSecurityPolicy','RciSecurityProtocol','RciStorageType','RciSubsidiary','RciTag','RciTransmissionType','RciUser','Research','Resource','Responsability','Script','ShortCut','SystemParam','Template','Theme','TranslateAction','TranslateActivity','TranslateCrosstab','TranslateDocIndex','TranslateDomain','TranslateExternal','TranslateField','TranslateFieldArea','TranslateFieldType','TranslateGroup','TranslateObject','TranslateObjectField','TranslateProcess','TranslateResearch','TranslateShortcut','TranslateTreeView','TranslateView','TreeView','User','View') ORDER BY score desc, idx_ukey LIMIT 50 OFFSET 0 Hosts=

En simplifiant :

Avec un mot complet (ici la ref d’un produit de la démo):

SELECT idx_object, idx_row_id, idx_ukey, idx_all
FROM m_index
WHERE to_tsvector('simple', idx_all) @@ to_tsquery('REF001:*')
AND idx_object = 'DemoProduct'

On trouve bien le seul record qui matche:

Mais effectivement avec une fin de mot on ne trouve rien:

SELECT idx_object, idx_row_id, idx_ukey, idx_all
FROM m_index
WHERE to_tsvector('simple', idx_all) @@ to_tsquery('001:*')
AND idx_object = 'DemoProduct'

NB : Par contre avec un début de mot on trouve bien tous les records qui matchent (ici tous les produits):

SELECT idx_object, idx_row_id, idx_ukey, idx_all
FROM m_index
WHERE to_tsvector('simple', idx_all) @@ to_tsquery('REF00:*')
AND idx_object = 'DemoProduct'

De ce que je comprends de la mécanique de la recherche fulltext PostgreSQL il n’y a pas moyen d’exprimer un “ends with” ou un “contains”, mais uniquement un “more or less equals” qui se comporte notamment comme une sorte de “starts with”. Je ne suis pas non plus expert de ce type de recherche…

Bref, à ce stade, pour répondre à un besoin de recherche de type “contains”, je ne vois pas d’autre solution que de ne pas utiliser la recherche fulltext en passant le param système USE_FULLTEXT_INDEXES à no, les recherches se feront alors avec des like %...% ce qui correspond à du “contains” mais sera moins précis/souple pour des recherches plus ciblées, comme par exemple utilisant des recherches avec combinaisons de mots:
image

1 Like

Pour notre utilisation c’est très bien, on ne fait pas de recherches complexes.
Merci !

This topic was automatically closed 60 minutes after the last reply. New replies are no longer allowed.