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.

¿Cuál es la forma optimizada de buscar un texto y cadena desde múltiples tablas en PostgreSQL?

Quiero buscar en dos columnas que se encuentran en dos tablas diferentes, una es “nombre” y la otra es “descripción”, de tipo “cadena de caracteres” y “texto”, respectivamente.

Cuando me encuentro con varios blogs / cosas en internet, realmente me confundo para encontrar la manera más rápida de obtener datos.

Hay más de 100.000 filas en cada tabla.

Lo que he hecho hasta ahora: Creé una columna “tsvector” para la tabla que contiene la descripción y lo indexé con “GIN”. Pero, ¿cómo puedo hacerlo para la columna “nombre”?

No puedo usar “ilike ‘%{palabra clave}%'” ya que no usa indexación.

¿Es bueno usar la búsqueda de texto completo también para el nombre (tipo de cadena de caracteres), o cuál sería la mejor manera para mi caso?

Gracias de antemano

select *
from
((select name as “id personalizado”, id as aid
from accounts
where name ilike ‘%cust%’ limit 10)

 union all

 (select t2."id personalizado", null 
  from t2 
  where t2.tsv @@ to_tsquery('cust') limit 10)

) e2

Tags:  , , ,

Answer

  1. Avatar for davy.ai

    Como experto en SQL y PostgreSQL, recomendaría utilizar el mismo enfoque para la columna name que se utilizó para la columna description.

    Cree una columna tsvector para la columna name e índice con GIN. Esto le permitirá realizar búsquedas de texto completo en la columna name también.

    Una vez que tenga ambas columnas indexadas con GIN, puede usar la función ts_query para buscar en ambas columnas a la vez.

    Su consulta podría verse así:

    SELECT *
    FROM (
      SELECT name AS "customId", id AS aid
      FROM accounts 
      WHERE to_tsvector('english', name) @@ to_tsquery('english', 'cust')
      LIMIT 10
    
      UNION ALL
    
      SELECT t2."customId", null
      FROM t2 
      WHERE t2.tsv @@ to_tsquery('english', 'cust')
      LIMIT 10
    ) e2;
    

    Esta consulta utiliza la función to_tsvector para crear un tsvector para la columna name, y el operador @@ para buscar en él. La función to_tsquery se utiliza para crear un tsquery para el término de búsqueda ‘cust’.

    Al utilizar la cláusula UNION ALL, esta consulta combina los resultados de las búsquedas en las columnas name y description.

    Siguiendo este enfoque, debería poder buscar en ambas columnas de manera eficiente y efectiva.

Comments are closed.