Полное руководство по OpenSearch: установка, настройка и использование

Основные команды по управлению базой данных OpenSearch. Управление базой данных, управление пользователями базы данных, управление таблицами, управление индексами, управление записями таблиц, связанные запросы, выгрузки данных во внешние источники, создание скриптов, загрузка данных из разных форматов

Оглавление

  1. Введение в OpenSearch
  2. Установка OpenSearch
  3. Настройка кластера
  4. Основные операции с индексами
  5. Работа с данными (CRUD)
  6. Поиск и агрегации
  7. Индексы и маппинги
  8. Безопасность и RBAC
  9. Мониторинг и логирование
  10. Резервное копирование
  11. Интеграция с Logstash и Kibana
  12. Использование в Python и Go

1. Введение в OpenSearch

OpenSearch — это форк Elasticsearch, созданный AWS после изменения лицензии Elastic.

🔹 Ключевые возможности:

  • Полнотекстовый поиск
  • Анализ логов и временных рядов
  • Поддержка REST API
  • Масштабируемость и отказоустойчивость

🔹 Основные компоненты:

  • OpenSearch — ядро поиска и аналитики
  • OpenSearch Dashboards (аналог Kibana) — визуализация данных
  • Logstash (опционально) — сбор и обработка данных

2. Установка OpenSearch

Linux (Debian/Ubuntu)

# Добавление репозитория OpenSearch
echo "deb https://artifacts.opensearch.org/releases/bundle/opensearch/2.x/apt stable main" | sudo tee /etc/apt/sources.list.d/opensearch-2.x.list

# Установка
wget -qO - https://artifacts.opensearch.org/publickeys/opensearch.pgp | sudo apt-key add -
sudo apt update
sudo apt install opensearch

Запуск сервиса

sudo systemctl start opensearch
sudo systemctl enable opensearch

Проверка работы

curl -X GET "https://localhost:9200" -u 'admin:admin' --insecure

Ответ:

{
  "name" : "opensearch-node1",
  "cluster_name" : "opensearch-cluster",
  "version" : {
    "distribution" : "opensearch",
    "number" : "2.11.0"
  }
}

3. Настройка кластера

Конфигурация находится в /etc/opensearch/opensearch.yml.

Базовая настройка

cluster.name: opensearch-cluster
node.name: opensearch-node1
network.host: 0.0.0.0
discovery.type: single-node  # Для однодоступной конфигурации
plugins.security.disabled: false  # Включить безопасность

Настройка кластера из нескольких узлов

discovery.seed_hosts: ["node1:9300", "node2:9300"]
cluster.initial_master_nodes: ["node1", "node2"]

4. Основные операции с индексами

Создание индекса

curl -X PUT "https://localhost:9200/my-index" -u 'admin:admin' --insecure

Удаление индекса

curl -X DELETE "https://localhost:9200/my-index" -u 'admin:admin' --insecure

Просмотр списка индексов

curl -X GET "https://localhost:9200/_cat/indices?v" -u 'admin:admin' --insecure

5. Работа с данными (CRUD)

Добавление документа

curl -X POST "https://localhost:9200/my-index/_doc/1" -u 'admin:admin' --insecure -H 'Content-Type: application/json' -d '
{
  "title": "OpenSearch Guide",
  "author": "admin",
  "tags": ["search", "database"]
}'

Получение документа

curl -X GET "https://localhost:9200/my-index/_doc/1" -u 'admin:admin' --insecure

Обновление документа

curl -X POST "https://localhost:9200/my-index/_update/1" -u 'admin:admin' --insecure -H 'Content-Type: application/json' -d '
{
  "doc": {
    "author": "new-author"
  }
}'

Удаление документа

curl -X DELETE "https://localhost:9200/my-index/_doc/1" -u 'admin:admin' --insecure

6. Поиск и агрегации

Простой поиск

curl -X GET "https://localhost:9200/my-index/_search?q=title:OpenSearch" -u 'admin:admin' --insecure

Сложный запрос (JSON-тело)

curl -X GET "https://localhost:9200/my-index/_search" -u 'admin:admin' --insecure -H 'Content-Type: application/json' -d '
{
  "query": {
    "match": {
      "title": "OpenSearch"
    }
  }
}'

Агрегации (группировка по тегам)

curl -X GET "https://localhost:9200/my-index/_search" -u 'admin:admin' --insecure -H 'Content-Type: application/json' -d '
{
  "aggs": {
    "tag_counts": {
      "terms": { "field": "tags.keyword" }
    }
  }
}'

7. Индексы и маппинги

Создание индекса с маппингом

curl -X PUT "https://localhost:9200/books" -u 'admin:admin' --insecure -H 'Content-Type: application/json' -d '
{
  "mappings": {
    "properties": {
      "title": { "type": "text" },
      "year": { "type": "integer" }
    }
  }
}'

Добавление нового поля

curl -X PUT "https://localhost:9200/books/_mapping" -u 'admin:admin' --insecure -H 'Content-Type: application/json' -d '
{
  "properties": {
    "author": { "type": "keyword" }
  }
}'

8. Безопасность и RBAC

Создание пользователя

curl -X PUT "https://localhost:9200/_plugins/_security/api/internalusers/user1" -u 'admin:admin' --insecure -H 'Content-Type: application/json' -d '
{
  "password": "secure123",
  "backend_roles": ["readers"]
}'

Назначение роли

curl -X PUT "https://localhost:9200/_plugins/_security/api/roles/read_only" -u 'admin:admin' --insecure -H 'Content-Type: application/json' -d '
{
  "cluster_permissions": [],
  "index_permissions": [{
    "index_patterns": ["*"],
    "allowed_actions": ["read"]
  }]
}'

9. Мониторинг и логирование

Проверка состояния кластера

curl -X GET "https://localhost:9200/_cluster/health" -u 'admin:admin' --insecure

Логи OpenSearch

tail -f /var/log/opensearch/opensearch.log

10. Резервное копирование

Использование Snapshot API

curl -X PUT "https://localhost:9200/_snapshot/my-backup" -u 'admin:admin' --insecure -H 'Content-Type: application/json' -d '
{
  "type": "fs",
  "settings": {
    "location": "/backups/opensearch"
  }
}'

Создание снепшота

curl -X PUT "https://localhost:9200/_snapshot/my-backup/snapshot-1" -u 'admin:admin' --insecure

11. Интеграция с Logstash и OpenSearch Dashboards

Настройка Logstash для отправки данных

input {
  file {
    path => "/var/log/app.log"
    start_position => "beginning"
  }
}
output {
  opensearch {
    hosts => ["https://localhost:9200"]
    index => "app-logs"
    user => "admin"
    password => "admin"
    ssl_certificate_verification => false
  }
}

Запуск OpenSearch Dashboards

sudo systemctl start opensearch-dashboards

Доступно по адресу: http://localhost:5601


12. Использование в Python и Go

Python (opensearch-py)

from opensearchpy import OpenSearch

client = OpenSearch(
    hosts=["https://localhost:9200"],
    http_auth=("admin", "admin"),
    verify_certs=False
)

response = client.index(
    index="my-index",
    body={"title": "Python OpenSearch Guide"}
)

Go (opensearch-go)

package main

import (
	"context"
	"github.com/opensearch-project/opensearch-go"
)

func main() {
	client, err := opensearch.NewClient(opensearch.Config{
		Addresses: []string{"https://localhost:9200"},
		Username:  "admin",
		Password:  "admin",
	})
	res, err := client.Index(
		"my-index",
		strings.NewReader(`{"title": "Go OpenSearch Guide"}`),
	)
}

Официальная документация: https://opensearch.org/docs