¿Cómo se llama cuando buscas el medio de una cadena en lugar del principio?

19

Estoy tratando de pulir mi vocabulario para comunicarme mejor con mis colegas desarrolladores. Tenemos varios lugares en el sitio donde estamos debatiendo si deberíamos buscar una cadena desde el principio 'running%'frente a cualquier parte de la cadena '%running%.

He estado llamando a la búsqueda intermedia "difusa", que me doy cuenta de que es incorrecta, ya que difusa significa cambiar la forma de la palabra "ejecutar", "ejecutar" [sic], "ejecutar" [sic].

¿Cuál es la terminología correcta para buscar el comienzo de una cadena y buscar en el medio de una cadena?

danielson317
fuente
1
He trabajado en lugares que usaban "Comienza con" vs "Contiene" para diferenciar entre esas dos opciones.
Solomon Rutzky

Respuestas:

24

Se llama un "patrón de búsqueda no anclado" , y se ve así en SQL.

foo LIKE '%bar%'

Si le falta uno %a cada lado, se dice que el patrón de búsqueda se ancla al inicio o al final de la cadena respectivamente. Esta jerga proviene del mundo regex.

foo LIKE 'bar%'

Diría, "el patrón de búsqueda bar%anclado al comienzo de la cadena ".

A modo de comparación, un PCRE está anclado con ^o $tokens y parece ^baro bar$. Los PCRE requieren un anclaje explícito con tokens, mientras que las LIKEsentencias SQL están implícitamente ancladas y requieren explícito %para crear un "patrón de búsqueda no anclado" .

Como nota al margen, puede indexar estos tipos de expresiones con trigramas usando algo como pg_trgmen PostgreSQL

Evan Carroll
fuente
1

Lo primero que me viene a la mente es "no Sargable ". La búsqueda de una cadena específica, o la primera parte de una cadena, en un campo indexado le permite buscar. Si su búsqueda comienza con un comodín, el RDBMS tendrá que escanear todo el índice, porque los valores que cumplan con su predicado de búsqueda podrían aparecer en cualquier parte del conjunto de valores.

Considere buscar en una guía telefónica (si tiene la edad suficiente para recordarlos ...). Puede encontrar fácilmente a las personas cuyos apellidos comienzan con "Dan": pasa el pulgar a los D, pasa a los DA y las cosas de DAN estarán todas juntas. Si desea encontrar personas cuyos apellidos incluyan la cadena "ANIEL", debería leer cada página (escanear la tabla).

Jon de todos los oficios
fuente
2
"RDBMS tendrá que escanear todo el índice", eso no es cierto. postgresql.org/docs/9.6/static/pgtrgm.html
Evan Carroll
Creo que unsardable podría ser un término más general de lo que se busca aquí, ya que cubre una serie de otros casos (buscando el resultado de una función realizada en una columna, por ejemplo).
David Spillett el
0

No es realmente tu pregunta, pero tu ejemplo de difuso es impreciso.

  • Fuzzy es lo opuesto a sharp, binary , lo que significa que puede tener un porcentaje de coincidencia, por ejemplo, una búsqueda difusa de 'run'precisión .5 incluirá 'run', 'rud' y muchas otras palabras. SQL no admite la búsqueda difusa, necesita sistemas adicionales como Lucene.
  • Una búsqueda con comodines'run%' siempre incluirá 'runing' y 'runed', y puede distinguir el comienzo con y contiene ( '%run%'para incluir 'outtrunning') como sugiere @ Solomon Rutzky
  • Sin embargo, si desea encontrar palabras completas , por ejemplo en bloques de texto, deberá indicar el espacio en blanco anterior o posterior ' run '(o ' run% 'incluir coincidencias parciales como 'bla bla runing bla' y 'bla runed bla bla').
Damian Vogel
fuente