2010-02-09 20 views
12

Esto puede ser una pregunta muy simplista, así que las disculpas de antemano, pero soy muy nuevo en el uso de la base de datos.Búsqueda de texto completo de Postgres en varias tablas relacionadas

Me gustaría que Postgres ejecute su búsqueda de texto completo en varias tablas unidas. Imagine algo así como un modelo de usuario, con los modelos relacionados UserProfile y UserInfo. La búsqueda solo sería para usuarios, pero incluiría información de UserProfile y UserInfo.

Estoy planeando usar un índice de ginebra para la búsqueda. No estoy claro, sin embargo, si necesitaré una columna de tsvector separada en la tabla de Usuario para mantener los tsvectors agregados a través de las tablas, y para configurar los desencadenantes para mantenerlo actualizado. O si es posible crear un índice sin una columna de tsvector que se mantendrá actualizado cada vez que cambie alguno de los campos relevantes en cualquiera de las tablas relevantes. Además, cualquier consejo sobre la sintaxis del comando para crear todo esto sería muy apreciado también.

Respuesta

8

Su mejor respuesta es probablemente tener una columna tsvector separada en cada tabla (con un índice, por supuesto). Si agrega los datos a un tsvector compartido, eso creará muchas actualizaciones en ese compartido cada vez que las actualizaciones individuales.

Necesitará un índice por tabla. Luego, cuando lo consulta, obviamente necesita varias cláusulas WHERE, una para cada campo. Luego, PostgreSQL determinará automáticamente qué combinación de índices usar para obtener los resultados más rápidos, probablemente usando el escaneo de mapa de bits. Hará que sus consultas sean un poco más complejas de escribir (ya que necesita varias cláusulas de coincidencia de columnas), pero eso mantiene la flexibilidad de consultar solo algunos de los campos en los casos que desee.

No puede crear un índice que rastree varias tablas. Para hacerlo, necesita la columna de tsvector separada y activadores en cada tabla para actualizarla.

+2

¿Puede entrar en detalles sobre cómo funcionaría la consulta de lectura? Estoy tratando de encontrar documentación sobre la mejor manera de hacer una búsqueda de texto completo postgresql en varias tablas y no encuentro mucho. Un problema que encontré es que si configuraba un índice en cada una de las tablas que estaba consultando, postgresql no podía usar todos los índices cuando hacía una consulta. Me gusta: seleccione * de las órdenes que se han unido en los usuarios ... left join en line_items ... donde ts_vector ('english', orders.id) @@ ... o ts_vector ('english', users.name) @@. .. –

+1

También veo que una búsqueda de búsqueda en dos tablas realiza un escaneo secuencial ('SELECT COUNT (*) FROM productos WHERE to_tsvector ('simple', products.name::text) @@ to_tsquery ('simple', 'foo ':: text); '), mientras que una consulta que busca una tabla solo realiza un análisis de índice de mapa de bits usando el índice (' SELECT COUNT (*) FROM productos LEFT JOIN marcas ON PRODUCT.brand_id = brands.id DONDE to_tsvector (' simple ' , products.name::text) @@ to_tsquery ('simple', 'foo' :: text) O to_tsvector ('simple', brands.name::text) @@ to_tsquery ('simple', 'foo' :: texto); '). – wvengen

Cuestiones relacionadas