es.davy.ai

Preguntas y respuestas de programación confiables

¿Tienes una pregunta?

Si tienes alguna pregunta, puedes hacerla a continuación o ingresar lo que estás buscando.

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.

Tags:  ,

Answer

  1. Avatar for 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 de john smith, las dos palabras se consideran lexemas separados y se almacenan como tales en la columna tsvector. Sin embargo, en el caso de john r. smith, la r. se considera parte de la misma palabra y se almacena como un único lexema.

    Al utilizar la función websearch_to_tsquery para buscar john 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 columna tsvector en esa posición, no se produce ninguna coincidencia y devuelve un resultado FALSE.

    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ón regexp_replace para eliminar todos los caracteres no alfanuméricos de la consulta de búsqueda antes de pasarla a la función websearch_to_tsquery:

    SELECT websearch_to_tsquery('simple', regexp_replace('john r. smith', '[^a-zA-Z0-9]+', ' ', 'g')) 
           @@ to_tsvector('simple', a.name)
    FROM names_table a;
    

    Esto reemplazará cualquier carácter no alfanumérico por espacios, tratando efectivamente la consulta como john r smith, lo que se correspondirá con el valor tsvector para john smith.

Comments are closed.