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?
terminology
regex
string-searching
danielson317
fuente
fuente
Respuestas:
Se llama un "patrón de búsqueda no anclado" , y se ve así en SQL.
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.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^bar
obar$
. Los PCRE requieren un anclaje explícito con tokens, mientras que lasLIKE
sentencias 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_trgm
en PostgreSQLfuente
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).
fuente
No es realmente tu pregunta, pero tu ejemplo de difuso es impreciso.
'run'
precisión .5 incluirá 'run', 'rud' y muchas otras palabras. SQL no admite la búsqueda difusa, necesita sistemas adicionales como Lucene.'run%'
siempre incluirá 'runing' y 'runed', y puede distinguir el comienzo con y contiene ('%run%'
para incluir 'outtrunning') como sugiere @ Solomon Rutzky' run '
(o' run% '
incluir coincidencias parciales como 'bla bla runing bla' y 'bla runed bla bla').fuente