Experimenta con Elasticsearch: Sumérgete en nuestros cuadernos de muestra, inicia una prueba gratuita del cloud o prueba Elastic en tu máquina local ahora.
El cliente Ruby de OpenSearch fue bifurcado desde el cliente Ruby de Elasticsearch en la versión 7.x, por lo que las bases de código son relativamente similares. Esto significa que, al migrar una base de código Ruby de OpenSearch a Elasticsearch, el código de las respectivas bibliotecas cliente resultará muy familiar. En esta entrada del blog, voy a mostrar un ejemplo de aplicación Ruby que emplea OpenSearch y los pasos para migrar este código a Elasticsearch.
Ambos clientes están lanzados bajo la popular Apache License 2.0, por lo que son software de código abierto y libre. La licencia de Elasticsearch se actualizó recientemente y el núcleo de Elasticsearch y Kibana se publica bajo la licencia de código abierto aprobada por la OSI AGPL desde la versión 8.16.
Considerando la versión de Elasticsearch al migrar la aplicación Ruby
Una consideración al migrar es qué versión de Elasticsearch se va a emplear. Recomendamos usar la última versión estable, que en el momento de escribir esto es 8.17.0. Las versiones menores del cliente Rubí de Elasticsearch siguen a las versiones menores de Elasticsearch. Así que para Elasticsearch 8.17.x, puedes usar la versión 8.17.x de la gema Rubí.
OpenSearch se bifurcó a partir de Elasticsearch 7.10.2. Así que las APIs pueden cambiar y se podrían usar diferentes funciones en cualquiera de las dos. Pero eso está fuera del alcance de esta publicación, y solo voy a analizar las operaciones más comunes en una aplicación de ejemplo.
Para Ruby on Rails, puedes usar el cliente oficial de Elasticsearch o las bibliotecas de integración de Rails. Recomendamos migrar a la última versión estable de Elasticsearch y del cliente, respectivamente. La versión elasticsearch-rails gema 8.0.0 soportar Rails 6.1, 7.0 y 7.1 y Elasticsearch 8.x.
El código
Para este ejemplo, seguí los pasos para instalar OpenSearch desde un tarball. Luego de descargar y extraer el tarball, necesitaba establecer una contraseña inicial de administrador que usaré más adelante para instanciar el cliente.
Creé un directorio con una Gemfile que se ve así:
Luego de ejecutar bundle install, se instala la gema para mi proyecto. Esta versión de opensearch-ruby instalada 3.4.0 y la versión de OpenSearch que estoy usando es 2.18.0. Escribí el código en un archivo example_code.rb en el mismo directorio. El código inicial en este archivo es la instancia de un cliente OpenSearch:
La opción de transporte ssl: { verify: false} el parámetro se está pasando según la guía de usuario para facilitar las pruebas. En producción, esto debería configurar dependiendo del despliegue de OpenSearch.
Desde la versión 2.12.0 de OpenSearch, la variable de entorno OPENSEARCH_INITIAL_ADMIN_PASSWORD debe establecer con una contraseña fuerte al ejecutar el script de instalación. Siguiendo los pasos para instalar OpenSearch desde un tarball, exporté la variable en mi consola y ahora está disponible para mi script Ruby.
Una API sencilla para cerciorar de que el cliente se conecta a OpenSearch es usar la API cluster.health :
Y efectivamente funciona:
Probé algunos de los ejemplos comunes que tenemos en la documentación del cliente Ruby de Elasticsearch, y funcionan como se espera:
Migración de la aplicación Ruby a Elasticsearch
El primer paso es agregar elasticsearch-ruby en el archivo gema. Tras ejecutar bundle install, se instalará la gema cliente Ruby de Elasticsearch. Si quieres probar tu código antes de migrar completamente, puedes dejar la gema opensearch-ruby ahí inicialmente.
El siguiente paso importante será la instanciación del cliente. Esto va a depender de cómo ejecutes Elasticsearch. Para mantener un enfoque similar en estos ejemplos, sigo los pasos de Download Elasticsearch y lo ejecuto localmente.
Al ejecutar bin/elasticsearch, Elasticsearch se iniciará con las funciones de seguridad configuradas automáticamente. Cerciórate de copiar la contraseña del usuario elástico (pero puedes restablecerla ejecutando bin/elasticsearch-reset-password -u elastic). Si sigues este ejemplo, cerciórate de detener OpenSearch antes de iniciar Elasticsearch, ya que se ejecutan en el mismo puerto.
Al principio de example_code.rb, comenté la instancia del cliente OpenSearch y agregué la instancia para un cliente Elasticsearch:
Como puedes ver, el código es casi idéntico en este escenario de pruebas. Variará según el despliegue de Elasticsearch y cómo decidas conectarte y autenticarte con él. Lo mismo aplica aquí que en OpenSearch en cuanto a seguridad, la opción de no verificar SSL es solo para fines de prueba y no debe usar en producción.
Una vez configurado el cliente, vuelvo a ejecutar el código con: bundle exec ruby example_code.rb. ¡Y todo simplemente funciona!
Problemas de depuración de migración
Dependiendo de las APIs que use tu aplicación, existe la posibilidad de que recibas un error al ejecutar tu código contra Elasticsearch si las APIs de OpenSearch divergen. La documentación de las APIs REST es una referencia esencial para obtener información detallada sobre cómo emplear las APIs. Cerciórate de consultar la documentación de la versión de Elasticsearch que estás usando. También puedes consultar la Elasticsearch::API referencia.
Algunos errores que puedes encontrar en Elasticsearch podrían ser:
ArgumentError: Required argument '<ARGUMENT>' missing- Esto es un error de cliente y se generará cuando una solicitud tenga un parámetro requerido.Elastic::Transport::Transport::Errors::BadRequest: [400] {"error":{"root_cause":[{"type":"illegal_argument_exception","reason":"request [/example/_doc] contains unrecognized parameter: [test]"}]...Este error proviene de Elasticsearch y significa que el código del cliente está usando un parámetro que Elasticsearch no reconoce para la API que se está empleando.
El cliente de Elasticsearch generará errores de Elasticsearch con el mensaje de error detallado enviado por el servidor. Así que, para parámetros o endpoints no soportados, el error debería informarte qué es diferente.
Conclusión
Como demostramos con este código de ejemplo, la migración de una aplicación Ruby de OpenSearch a Elasticsearch no es demasiado compleja desde el punto de vista de Ruby. Debes estar atento al versionado y a cualquier posible divergencia de APIs entre los motores de búsqueda. Pero para las acciones más comunes, el principal cambio al migrar clientes está en la instancia. Ambos son similares en ese aspecto, pero la forma en que se definen el host y las credenciales varía en función de cómo se despliega la pila. Una vez que el cliente está configurado y verifica que se conecta a Elasticsearch, puedes reemplazar el cliente OpenSearch sin problemas por el cliente Elasticsearch.

