PostgreSQL (búsqueda de texto completo) vs ElasticSearch


10

Hola, estoy investigando antes de implementar la función de búsqueda en mi servicio. Actualmente estoy usando PostgreSQL como mi almacenamiento principal. Definitivamente podría usar la búsqueda de texto completo incorporada de PostgreSQL, pero el problema es que tengo datos dispersos en varias tablas.

Mi servicio es un sitio web de comercio electrónico. Entonces, si un cliente busca "una buena computadora portátil de Apple", necesito unirme a la Brandtabla, posttabla y reviewtabla (1 publicación es una combinación de varias revisiones + resumen breve) para buscar completamente todas las publicaciones. Si tuviera que usar Elasticsearch, podría insertar publicaciones completas mediante el preprocesamiento.

Según mi investigación, algunas personas dijeron que FTS y Elasticsearch de PostgreSQL tienen un rendimiento similar y algunas personas dijeron que Elasticsearch es más rápido. ¿Cuál sería la mejor solución para mi caso?

Gracias por adelantado


¿Cómo sabe que la palabra clave de búsqueda está relacionada con algunas tablas que ha almacenado en su base de datos?
Coníferas

No ... Entonces estaba pensando en unir todas las columnas posibles en diferentes tablas y convertirlas en ts_vector. ¿Hay alguna solución mejor?
JSC

Hmm, esto implicará un problema de reconocimiento semántico y es otra historia ...
Coníferas

Respuestas:


-5

Respuesta corta: Elasticsearch es mejor

Explicación: PostgreSQL y Elasticsearch son bases de datos de 2 tipos diferentes. Elasticsearch es potente para la búsqueda de documentos y PostgreSQL sigue siendo un RDBMS tradicional. Verifique su objetivo de que desee buscar texto en algunas publicaciones. No importa cómo PostgreSQL tenga un buen desempeño en sus búsquedas de texto completo, Elasticsearch está diseñado para buscar en textos y documentos (o registros) enormes. Y cuanto más tamaño desee buscar, más Elasticsearch es mejor que PostgreSQL en rendimiento. Además, también podría obtener muchos beneficios y un gran rendimiento si procesa previamente las publicaciones en varios campos e índices antes de almacenarlas en Elasticsearch.

Si seguramente necesita la función de texto completo, puede considerar MSSQL, que puede funcionar mejor que PostgreSQL.

Respuesta a los comentarios: Debe ser el sentido común para la comparación de propiedades en esos diferentes tipos de bases de datos. Dado que OP no proporcionó la cantidad y el tamaño de los datos almacenados. Si se trata de datos de búsqueda de tamaño pequeño, tal vez elegir Postgre o ES están bien. Sin embargo, si el depósito de transacciones y datos se vuelve tan grande en el futuro, ES obtendrá su beneficio.

Puede consultar este sitio para conocer el ranking actual de cada tipo de base de datos y elegir el mejor entre sus requisitos, arquitectura y crecimiento de datos en el futuro de sus aplicaciones.


Se acordó la retórica, pero si tiene alguna prueba u otras fuentes, será más confiable.
Jaisus

2
Su respuesta solo se basa en sus opiniones, no ha escrito ningún ejemplo, punto de referencia o enlace para demostrar su punto y no puedo ver otras respuestas suyas sobre el tema que puedan demostrar que conoce este software. Veo que usted es un nuevo contribuyente, por lo que le sugeriría para la próxima vez que no escriba una oración absoluta e informe sus experiencias, datos reales o enlaces para probar su tesis.
Paolo Melchiorre

@conifers bien la actualización y la aclaración de su respuesta, pero el enlace que agregó no prueba su punto. Me hubiera interesado si hubiera agregado una URL con una comparación o un punto de referencia.
Paolo Melchiorre

la clasificación por popularidad no significa que Elasticsearch supere a PostgreSQL cuando se trata de búsqueda de texto completo. "Mejor" y "Debe ser el sentido común" significa que esperamos ver algún punto de referencia o prueba que compare esas dos tecnologías en su respuesta, que no existe.
Yasser Sinjab

9

Si PostgreSQL ya está en su pila, la mejor opción para usted es usar la búsqueda de texto completo de PostgreSQL.

¿Por qué la búsqueda de texto completo (FTS) en PostgreSQL?

Porque de lo contrario, debe alimentar el contenido de la base de datos a motores de búsqueda externos.

Los motores de búsqueda externos (p. Ej., Elasticsearch) son rápidos PERO :

  • No pueden indexar todos los documentos, podrían ser totalmente virtuales
  • No tienen acceso a los atributos: no hay consultas complejas
  • Tienen que mantenerse: dolor de cabeza para DBA
  • A veces necesitan ser certificados
  • No proporcionan búsqueda instantánea (necesitan tiempo para descargar nuevos datos y reindexar)
  • No proporcionan coherencia: los resultados de búsqueda ya se pueden eliminar de la base de datos

Si desea leer más sobre FTS en PostgreSQL, hay una gran presentación de Oleg Bartunov (extraje la lista anterior de aquí): " ¿Necesita una búsqueda de texto completo en PostgreSQL? "

Este es un breve ejemplo de cómo puede crear un "Documento" (lea la documentación de búsqueda de texto ) de más de una tabla en SQL:

SELECT to_tsvector(posts.summary || ' ' || brands.name) 
FROM posts
INNER JOIN brands ON (brand_id = brands.id);

Si está utilizando Django para su sitio web de comercio electrónico, también puede leer este artículo que escribí sobre " Búsqueda de texto completo en Django con PostgreSQL "


Algo sobre la declaración de Elasticsearch está mal ... No pueden indexar todos los documentos: ¡ Seguramente tú puedes! Si ya lo identificó y lo transformó en su configuración durante la indexación, al igual que en PostgreSQL, primero debe definir el DDL. No tienen acceso a los atributos : Sí, podría ser cierto debido a que PostgreSQL es una base de datos de uso general, necesita soportar CRUD bien. Deben mantenerse : ¿PostgreSQL no necesita mantenimiento? ... La copia de seguridad de rutina, el ajuste del rendimiento aún se requiere sin importar el tipo de base de datos.
Coníferas

No proporcionan búsqueda instantánea : Bueno, ES es solo fuerte en búsqueda instantánea ... por favor, intente Kibana en primer lugar. No proporcionan coherencia : esta podría ser la única declaración verdadera debido a que se requiere cualquier RDBMS en las propiedades de ACID.
Coníferas

1
La oración completa es No proporcionan búsqueda instantánea (necesitan tiempo para descargar nuevos datos y reindexar) : significa que si su usuario en el sitio web de comercio electrónico (como en la pregunta) compra el último Artículo1 disponible, esta información se almacena instantáneamente en PostgreSQL, y si usa la búsqueda de texto completo de PostgreSQL, otros usuarios no encontrarán Item1 en la sección de búsqueda. De lo contrario, si usa Elasitcsearch, necesita tiempo para enviar esta nueva información a Elasticsearch y reindexar antes de que otros usuarios dejen de ver el Elemento1 en el resultado de la búsqueda. Tal vez intentan comprarlo, pero ya no está disponible. :-(
Paolo Melchiorre

2
Sobre todos los demás puntos en la lista, solo hay una cosa que quiero escribir: en la pregunta original @jsc escribió que ya tienen PostgreSQL en su pila, por lo que los datos ya están almacenados allí, ya tienen acceso a todos los atributos para ejecutar el texto completo buscar con consulta relacional. PERO si usa Elasticsearch, debe agregar tiempo para enviar una pequeña parte de los datos (no todos los atributos) de PG a ES, tiempo para reindexar los datos en ES. Al finalizar el uso de ES, tendrá que administrar otro servicio, más memoria ocupada, más espacio de almacenamiento para almacenar datos redundantes y retrasar todo el proceso.
Paolo Melchiorre
Al usar nuestro sitio, usted reconoce que ha leído y comprende nuestra Política de Cookies y Política de Privacidad.
Licensed under cc by-sa 3.0 with attribution required.