Comment s'appelle-t-on lorsque vous recherchez le milieu d'une chaîne au lieu du début?

19

J'essaie de peaufiner mon vocabulaire pour mieux communiquer avec mes collègues développeurs. Nous avons plusieurs endroits sur le site où nous discutons si nous devons rechercher une chaîne depuis le début 'running%'vs n'importe où dans la chaîne '%running%.

J'ai appelé la recherche du milieu "floue", ce qui, je le réalise, est incorrect car flou signifie changer la forme du mot "run", "runing" [sic], "runed" [sic].

Quelle est la terminologie correcte pour rechercher le début d'une chaîne et rechercher le milieu d'une chaîne?

danielson317
la source
1
J'ai travaillé dans des endroits qui utilisaient "Commence par" vs "Contient" pour différencier ces deux options.
Solomon Rutzky

Réponses:

24

Cela s'appelle un "modèle de recherche non ancré" , et il ressemble à ceci dans SQL.

foo LIKE '%bar%'

Si vous manquez d'un %côté ou de l'autre, il est dit que le motif de recherche s'ancre respectivement au début ou à la fin de la chaîne. Ce jargon vient du monde regex.

foo LIKE 'bar%'

Vous diriez, "le modèle de recherche bar%ancré au début de la chaîne ".

A titre de comparaison, un PCRE est ancré avec ^ou des $jetons et il ressemble à ^barou bar$. Les PCRE nécessitent un ancrage explicite avec des jetons, tandis que les LIKEinstructions SQL sont implicitement ancrées et nécessitent explicitement %de créer un "modèle de recherche non ancré" .

En remarque, vous pouvez indexer ces types d'expressions avec des trigrammes en utilisant quelque chose comme pg_trgmdans PostgreSQL

Evan Carroll
la source
1

La première chose qui me vient à l'esprit est « inconcevable ». La recherche d'une chaîne spécifique, ou de la première partie d'une chaîne, dans un champ indexé vous permet de rechercher. Si votre recherche commence par un caractère générique, le SGBDR devra analyser l'intégralité de l'index, car les valeurs qui correspondent à votre prédicat de recherche peuvent apparaître n'importe où dans l'ensemble de valeurs.

Pensez à regarder dans un annuaire téléphonique (si vous êtes assez vieux pour vous en souvenir ...). Vous pouvez facilement trouver des personnes dont le nom de famille commence par «Dan:» vous faites un pouce vers les D, vous retournez vers les DA, et les quelque chose de DAN seront tous ensemble. Si vous souhaitez trouver des personnes dont le nom de famille inclut la chaîne "ANIEL", vous devez lire chaque page (scannez le tableau).

Jon de tous les métiers
la source
2
"RDBMS devra analyser tout l'index" ce n'est pas vrai. postgresql.org/docs/9.6/static/pgtrgm.html
Evan Carroll
Je pense que le terme non arguable pourrait être un terme plus général que celui recherché ici car il couvre un certain nombre d'autres cas (recherche du résultat d'une fonction exécutée sur une colonne, par exemple).
David Spillett
0

Ce n'est pas vraiment votre question, mais votre exemple de flou est imprécis.

  • Fuzzy est l'opposé de sharp, binary , ce qui signifie que vous pouvez avoir un pourcentage de correspondance, par exemple une recherche floue pour une 'run'précision de 0,5 inclura «ran», «rud» et beaucoup d'autres mots. SQL ne prend pas en charge la recherche floue, vous avez besoin de systèmes supplémentaires comme Lucene.
  • Une recherche avec caractères génériques'run%' comprendra toujours «runing» et «runed», et vous pouvez distinguer le début par et contient ( '%run%'pour inclure «outrunning») comme le suggère @ Solomon Rutzky
  • Cependant, si vous voulez trouver des mots entiers , par exemple dans des blocs de texte, vous devrez indiquer les espaces précédents ou finaux ' run '(ou ' run% 'inclure des correspondances partielles telles que `` bla bla runing bla '' et `` bla runed bla bla '').
Damian Vogel
la source