Español
Empezar

← Todas las plantillas · Herramientas de desarrollo

Despliega OpenSearch en un clic

Motor de búsqueda y analítica de código abierto, con OpenSearch Dashboards: búsqueda de texto completo y vectorial, logs y paneles de control

Una alternativa autoalojada a Elasticsearch y Algolia.

¿Qué es OpenSearch?

OpenSearch es un motor de búsqueda y analítica: le envías documentos JSON por una API REST, y los encuentra por texto completo, los filtra y los agrupa, y los busca por vectores para apps de IA con su plugin k-NN. OpenSearch Dashboards es su interfaz web: paneles de control y gráficos, Discover para explorar logs y eventos, Dev Tools para enviar consultas, y páginas para sus plugins, como seguridad, alertas y detección de anomalías.

OpenSearch nació en 2021 como fork de Elasticsearch 7.10.2 y Kibana, cuando Elastic les cambió la licencia, y es de código abierto bajo Apache 2.0. Desde 2024 lo dirige la OpenSearch Software Foundation, parte de la Linux Foundation. Esta plantilla ejecuta un nodo con OpenSearch Dashboards en la dirección del proyecto, con el plugin de seguridad activado: sus únicos usuarios son el administrador, creado con los datos de los campos antes de que OpenSearch responda a nadie, y el propio de Dashboards, así que no hay ninguno de los usuarios de demostración de la imagen, cuyas contraseñas están publicadas. El inconveniente: funciona con Java y ocupa más memoria que motores de búsqueda más ligeros, y un solo nodo no guarda réplicas de sus índices.

Hosting de OpenSearch en Pethost

  1. Inicias sesión en Pethost con una passkey, GitHub o Google. ¿Aún no tienes máquina? Eliges un plan, y el enlace espera hasta que esté lista.
  2. Nuevo proyecto se abre en OpenSearch. Rellenas lo que pide y haces clic en Crear proyecto: Contraseña de administrador.
  3. En un par de minutos OpenSearch está en marcha en su propia dirección con HTTPS. Sus secretos se generan al azar, y sus datos entran en el backup de cada noche.
  4. Es un proyecto como cualquier otro: tú o tu agente lo pueden cambiar, volver a una versión anterior o restaurar.

Preguntas sobre OpenSearch

¿OpenSearch es gratis?

Sí. OpenSearch y OpenSearch Dashboards son de código abierto bajo la licencia Apache 2.0, con todos los plugins incluidos y sin edición de pago. Amazon vende una versión administrada, Amazon OpenSearch Service.

OpenSearch frente a Elasticsearch: ¿en qué se diferencian?

OpenSearch empezó como fork de Elasticsearch 7.10.2 en 2021, así que su lenguaje de consultas y su API REST resultan familiares, pero desde entonces los dos se distanciaron. OpenSearch usa la licencia Apache 2.0 e integra seguridad, alertas y búsqueda vectorial, mientras que Elastic vende Elasticsearch bajo sus propias licencias y la AGPL.

¿Puedo usar OpenSearch para búsqueda vectorial?

Sí. Su plugin k-NN guarda vectores junto a tus documentos y encuentra los más cercanos, con los motores Lucene y Faiss, y su plugin de búsqueda neuronal lo combina con la búsqueda de texto, para la búsqueda semántica y la recuperación en apps de IA.

¿Cómo se conectan mis apps a OpenSearch?

Por su API REST en el puerto 9200. Agrega un host en la pestaña Dominios del proyecto con una ruta al servicio opensearch en ese puerto, y conecta tus apps con un cliente oficial (Python, JavaScript, Java, Go, Ruby, PHP, .NET o Rust) o directamente por HTTPS, iniciando sesión como admin o como un usuario que crees para la app.

¿Cuánta memoria y disco necesita OpenSearch?

OpenSearch funciona con Java y un heap de 512 MB: unos 1,3 GB de memoria con OpenSearch Dashboards en reposo, más a medida que crecen los índices; para índices grandes, aumenta el heap en OPENSEARCH_JAVA_OPTS. En Pethost le basta el plan Starter, y queda sitio para otras apps a su lado.

El archivo Docker Compose de OpenSearch

La plantilla es este compose.yaml y las variables que se escriben en el .env del proyecto al crearlo. Pethost ejecuta el archivo tal como está escrito.

Contenedores: opensearch (opensearchproject/opensearch:3), dashboards (opensearchproject/opensearch-dashboards:3).

Volúmenes, en el backup de cada noche: data.

services:
  opensearch:
    image: opensearchproject/opensearch:3
    restart: unless-stopped
    environment:
      OPENSEARCH_JAVA_OPTS: -Xms512m -Xmx512m
      ADMIN_PASSWORD: ${ADMIN_PASSWORD}
      DASHBOARDS_PASSWORD: ${DASHBOARDS_PASSWORD}
      # The image's demo configuration would add its demo users, whose passwords are published,
      # and certificates whose keys are too: this start writes its own instead.
      DISABLE_INSTALL_DEMO_CONFIG: "true"
    # At each start: a certificate authority and a node certificate of this container's own for
    # the security plugin's transport layer, made with the JDK's keytool, as the image has no
    # openssl; opensearch.yml with them; and the users the security index is made from at the
    # first start: the administrator with the password given, not reserved, so that it can change
    # its password with no admin certificate, and OpenSearch Dashboards' server user. Once the index exists, OpenSearch reads its users from it, and a password changed in
    # OpenSearch Dashboards stays. A single node holds no replica, so an index asks for none. The
    # REST API answers over HTTP inside the project, where the proxy brings HTTPS requests.
    command:
      - bash
      - -c
      - |
        set -e
        cd /usr/share/opensearch
        if [ "$${#ADMIN_PASSWORD}" -lt 8 ]; then
          echo "The admin password must have 8 characters at least, as OpenSearch asks." >&2
          exit 1
        fi
        keytool=jdk/bin/keytool
        certs=config/certs
        store=$$(head -c 16 /dev/urandom | od -An -tx1 | tr -d ' \n')
        rm -rf "$$certs"
        mkdir -p "$$certs"
        $$keytool -genkeypair -alias ca -keyalg RSA -keysize 2048 -validity 3650 -dname CN=opensearch-ca -ext bc:c \
          -keystore "$$certs/ca.p12" -storetype PKCS12 -storepass "$$store" 2> /dev/null
        $$keytool -exportcert -rfc -alias ca -keystore "$$certs/ca.p12" -storepass "$$store" -file "$$certs/ca.pem" 2> /dev/null
        $$keytool -genkeypair -alias node -keyalg RSA -keysize 2048 -validity 3650 -dname CN=opensearch \
          -keystore "$$certs/node.p12" -storetype PKCS12 -storepass "$$store" 2> /dev/null
        $$keytool -certreq -alias node -keystore "$$certs/node.p12" -storepass "$$store" -file "$$certs/node.csr" 2> /dev/null
        $$keytool -gencert -rfc -alias ca -keystore "$$certs/ca.p12" -storepass "$$store" -validity 3650 \
          -ext SAN=dns:opensearch,dns:localhost -ext KU=digitalSignature,keyEncipherment -ext EKU=serverAuth,clientAuth \
          -infile "$$certs/node.csr" -outfile "$$certs/node.pem" 2> /dev/null
        $$keytool -importcert -noprompt -alias ca -file "$$certs/ca.pem" -keystore "$$certs/node.p12" -storepass "$$store" 2> /dev/null
        $$keytool -importcert -noprompt -alias node -file "$$certs/node.pem" -keystore "$$certs/node.p12" -storepass "$$store" 2> /dev/null
        $$keytool -importcert -noprompt -alias ca -file "$$certs/ca.pem" -keystore "$$certs/trust.p12" -storetype PKCS12 -storepass "$$store" 2> /dev/null
        rm "$$certs/ca.p12" "$$certs/node.csr"
        cat > config/opensearch.yml <<YAML
        cluster.name: opensearch
        network.host: 0.0.0.0
        discovery.type: single-node
        cluster.default_number_of_replicas: 0
        plugins.security.ssl.transport.keystore_type: PKCS12
        plugins.security.ssl.transport.keystore_filepath: certs/node.p12
        plugins.security.ssl.transport.keystore_password: $$store
        plugins.security.ssl.transport.truststore_type: PKCS12
        plugins.security.ssl.transport.truststore_filepath: certs/trust.p12
        plugins.security.ssl.transport.truststore_password: $$store
        plugins.security.ssl.transport.enforce_hostname_verification: false
        plugins.security.ssl.http.enabled: false
        plugins.security.nodes_dn: ["CN=opensearch"]
        plugins.security.allow_default_init_securityindex: true
        plugins.security.restapi.roles_enabled: ["all_access", "security_rest_api_access"]
        YAML
        hash() { plugins/opensearch-security/tools/hash.sh -env "$$1" 2> /dev/null | tail -n 1; }
        cat > config/opensearch-security/internal_users.yml <<YAML
        _meta:
          type: internalusers
          config_version: 2
        admin:
          hash: "$$(hash ADMIN_PASSWORD)"
          reserved: false
          backend_roles: [admin]
          description: The administrator
        kibanaserver:
          hash: "$$(hash DASHBOARDS_PASSWORD)"
          reserved: true
          description: OpenSearch Dashboards' server
        YAML
        exec ./opensearch-docker-entrypoint.sh opensearch
    volumes:
      - data:/usr/share/opensearch/data
    # Up means answering, which asks for a password: 401 to a request with none.
    healthcheck:
      test: ["CMD-SHELL", "code=$$(curl -s -o /dev/null -w '%{http_code}' http://127.0.0.1:9200/); [ \"$$code\" = 401 ]"]
      interval: 5s
      timeout: 5s
      retries: 10
      start_period: 120s

  dashboards:
    image: opensearchproject/opensearch-dashboards:3
    restart: unless-stopped
    environment:
      OPENSEARCH_HOSTS: '["http://opensearch:9200"]'
      OPENSEARCH_USERNAME: kibanaserver
      OPENSEARCH_PASSWORD: ${DASHBOARDS_PASSWORD}
    depends_on:
      opensearch:
        condition: service_healthy

volumes:
  data:

Más en Herramientas de desarrollo