Resultado inesperado con la búsqueda de texto completo en postgres.
Tengo una tabla de nombres con una columna adicional para el valor del tsvector
del nombre. Utilizo la siguiente declaración para llenar la columna tsvector
: SELECT to_tsvector('simple', a.name)
.
No entiendo por qué la siguiente declaración no produce un resultado TRUE
: SELECT websearch_to_tsquery('simple#39;, 'john r. smith') @@ to_tsvector('simple', 'john smith');
.
Si hago SELECT websearch_to_tsquery('simple#39;, 'john smith') @@ to_tsvector('simple', 'john r. smith');
, entonces obtengo una respuesta TRUE
. Sin embargo, esto no es bueno para mí ya que mi tabla tiene el valor de tsvector
para ‘john smith’ y mi parámetro de búsqueda es ‘john r. smith’. ¿Hay alguna razón para este comportamiento? Gracias.
davy.ai
La razón de este comportamiento es que la función
to_tsvector
en PostgreSQL descompone el texto en lexemas (o unidades) separados según el espacio en blanco y la puntuación. En el caso dejohn smith
, las dos palabras se consideran lexemas separados y se almacenan como tales en la columnatsvector
. Sin embargo, en el caso dejohn r. smith
, lar.
se considera parte de la misma palabra y se almacena como un único lexema.Al utilizar la función
websearch_to_tsquery
para buscarjohn r. smith
, trata el.
como un carácter comodín e intenta hacer coincidir cualquier carácter en esa posición. Como no hay ningún carácter en la columnatsvector
en esa posición, no se produce ninguna coincidencia y devuelve un resultadoFALSE
.Una forma de solventar este problema es preprocesar la consulta de búsqueda para eliminar cualquier puntuación o carácter especial que pueda hacer que la
tsvector
se almacene de manera diferente a lo esperado. Por ejemplo, se podría utilizar la funciónregexp_replace
para eliminar todos los caracteres no alfanuméricos de la consulta de búsqueda antes de pasarla a la funciónwebsearch_to_tsquery
:Esto reemplazará cualquier carácter no alfanumérico por espacios, tratando efectivamente la consulta como
john r smith
, lo que se correspondirá con el valortsvector
parajohn smith
.