web-dev-qa-db-fra.com

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

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" qui, je le réalise, est incorrecte car floue 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?

19
danielson317

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

foo LIKE '%bar%'

Si vous n'avez pas de % De chaque côté, il est dit que le modèle de recherche 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 des jetons ^ Ou $ Et il ressemble à ^bar Ou bar$. Les PCRE nécessitent un ancrage explicite avec des jetons, tandis que les instructions SQL LIKE sont implicitement ancrées et nécessitent explicitement % Pour 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_trgm Dans PostgreSQL

24
Evan Carroll

La première chose qui me vient à l'esprit est "un - Sargable ". 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).

1

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 'run' avec une 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 générique recherche 'run%' inclura toujours 'runing' et 'runed', et vous pouvez distinguer que commence par et contient ('%run%' pour inclure "dépassement") comme le suggère @ Solomon Rutzky
  • Cependant, si vous voulez trouver des mots entiers , par exemple dans des blocs de texte, vous devez indiquer les espaces précédents ou finaux ' run ' (ou ' run% ' pour inclure des correspondances partielles telles que "bla bla runing bla" et "bla runed bla bla").
0
Damian Vogel