Menu
Szybki wybór
Hosting Domeny VPS SSL Kalkulator Porównania FAQ
Aktywne kody
Wszystkie kody rabatowe

Elasticsearch na VPS — instalacja, indeksy i Query DSL

Opublikowano: 10 kwietnia 2026 · Kategoria: VPS / Bazy danych

Elasticsearch to rozproszony silnik wyszukiwania i analizy oparty na Apache Lucene. Sprawdza się wszędzie tam gdzie potrzebujesz pełnotekstowego wyszukiwania z fazetami, agregacji danych w czasie rzeczywistym, lub przechowywania i analizy logów (stos ELK/EFK). W odróżnieniu od relacyjnych baz danych, Elasticsearch jest zoptymalizowany pod kątem szybkiego wyszukiwania w ogromnych zbiorach danych tekstowych. Ten artykuł pokazuje jak zainstalować i skonfigurować Elasticsearch na własnym VPS, stworzyć pierwsze indeksy z mappingiem i napisać podstawowe zapytania Query DSL.

Instalacja Elasticsearch na Ubuntu

# Wymagania systemowe
# - Ubuntu 20.04+ lub Debian 11+
# - Minimum 2 GB RAM (produkcja: 8-16 GB)
# - Java 17+ (bundlowana z ES 8.x)

# Dodaj oficjalne repo Elastic
wget -qO - https://artifacts.elastic.co/GPG-KEY-elasticsearch | \
  sudo gpg --dearmor -o /usr/share/keyrings/elasticsearch-keyring.gpg

echo "deb [signed-by=/usr/share/keyrings/elasticsearch-keyring.gpg] \
  https://artifacts.elastic.co/packages/8.x/apt stable main" | \
  sudo tee /etc/apt/sources.list.d/elastic-8.x.list

sudo apt update && sudo apt install elasticsearch -y

# Zapisz haslo dla uzytkownika elastic z outputu instalacji!
# Security autoconfiguration information:
# Authentication and authorization are enabled.
# TLS for the HTTP and transport layers is enabled.
# The generated password for the elastic built-in superuser is: XXXX

sudo systemctl enable elasticsearch
sudo systemctl start elasticsearch
sudo systemctl status elasticsearch

Konfiguracja — elasticsearch.yml i JVM heap

# /etc/elasticsearch/elasticsearch.yml

# Nazwa klastra i wezla
cluster.name: moj-klaster
node.name: node-1

# Katalogi danych i logow
path.data: /var/lib/elasticsearch
path.logs: /var/log/elasticsearch

# Nasluchiwanie (dla jednego wezla: localhost; dla klastra: 0.0.0.0)
network.host: 127.0.0.1
http.port: 9200

# Single-node discovery (development / standalone VPS)
discovery.type: single-node

# Security (ES 8.x - domyslnie wlaczone)
xpack.security.enabled: true
xpack.security.http.ssl:
  enabled: true
  keystore.path: certs/http.p12

# Wylacz security tylko w DEV (NIGDY w produkcji)
# xpack.security.enabled: false
# /etc/elasticsearch/jvm.options.d/heap.options
# Regula: 50% dostepnego RAM, max 30 GB
# Dla VPS 8 GB RAM:
-Xms4g
-Xmx4g

# Sprawdz aktualne uzycie heap
curl -s -u elastic:haslo https://localhost:9200/_cat/nodes?v&h=heap.current,heap.percent,heap.max

# Wylacz swap systemowy (wazne dla ES!)
sudo swapoff -a
# Dodaj do /etc/fstab: zakomentuj linie swap

Pierwsze kroki — weryfikacja i REST API

# Sprawdz czy dziala (ES 8.x wymaga TLS i auth)
curl -s --cacert /etc/elasticsearch/certs/http_ca.crt \
  -u elastic:TWOJE_HASLO \
  https://localhost:9200

# Odpowiedz:
# { "name": "node-1", "cluster_name": "moj-klaster", "version": { "number": "8.x.x" } }

# Stan klastra
curl -s -u elastic:HASLO https://localhost:9200/_cluster/health?pretty

# Lista indeksow
curl -s -u elastic:HASLO https://localhost:9200/_cat/indices?v

# Wersja uproszczona — proxy przez nginx bez TLS (tylko LAN!)
# Mozna wystawic HTTP na lokalnym porcie dla ulatwiania pracy
# NIE wystawiaj Elasticsearch bezposrednio na internet bez TLS + auth!

Tworzenie indeksu z mappingiem

Mapping definiuje typy pól — podobnie jak schemat w SQL. Dobrze zaprojektowany mapping jest kluczowy dla wydajności i poprawności wyników wyszukiwania:

PUT /produkty
{
  "settings": {
    "number_of_shards": 1,
    "number_of_replicas": 0,
    "analysis": {
      "analyzer": {
        "polish_analyzer": {
          "type": "standard",
          "stopwords": "_polish_"
        }
      }
    }
  },
  "mappings": {
    "properties": {
      "nazwa": {
        "type": "text",
        "analyzer": "polish_analyzer",
        "fields": {
          "keyword": { "type": "keyword" }
        }
      },
      "opis": { "type": "text", "analyzer": "polish_analyzer" },
      "cena": { "type": "float" },
      "kategoria": { "type": "keyword" },
      "dostepny": { "type": "boolean" },
      "data_dodania": { "type": "date" },
      "tagi": { "type": "keyword" }
    }
  }
}
# Dodaj dokument
POST /produkty/_doc/1
{
  "nazwa": "Hosting SSD NVMe 10 GB",
  "opis": "Szybki hosting z dyskiem SSD NVMe, SSL i backupem codziennym",
  "cena": 19.99,
  "kategoria": "hosting",
  "dostepny": true,
  "data_dodania": "2026-04-10",
  "tagi": ["ssd", "nvme", "ssl"]
}

# Pobierz dokument po ID
GET /produkty/_doc/1

# Bulk insert (wydajniejsze dla duzych zbiorow)
POST /produkty/_bulk
{ "index": { "_id": "2" } }
{ "nazwa": "VPS 2 GB RAM", "cena": 29.99, "kategoria": "vps" }
{ "index": { "_id": "3" } }
{ "nazwa": "VPS 4 GB RAM", "cena": 49.99, "kategoria": "vps" }

Podstawy Query DSL

Query DSL (Domain Specific Language) to język zapytań oparty na JSON. Kluczowe typy zapytań:

# match — pełnotekstowe wyszukiwanie (analizator)
GET /produkty/_search
{
  "query": {
    "match": {
      "nazwa": "hosting ssd"
    }
  }
}

# term — dokładne dopasowanie (bez analizy, dla keyword/number/bool)
GET /produkty/_search
{
  "query": {
    "term": { "kategoria": "hosting" }
  }
}

# bool — kombinacja warunków (must/should/must_not/filter)
GET /produkty/_search
{
  "query": {
    "bool": {
      "must": [
        { "match": { "nazwa": "hosting" } }
      ],
      "filter": [
        { "term": { "dostepny": true } },
        { "range": { "cena": { "lte": 50 } } }
      ],
      "must_not": [
        { "term": { "tagi": "wyprzedaz" } }
      ]
    }
  }
}
# Aggregations — statystyki i fazetowanie
GET /produkty/_search
{
  "size": 0,
  "aggs": {
    "po_kategorii": {
      "terms": { "field": "kategoria" }
    },
    "srednia_cena": {
      "avg": { "field": "cena" }
    },
    "zakres_cen": {
      "range": {
        "field": "cena",
        "ranges": [
          { "to": 20 },
          { "from": 20, "to": 50 },
          { "from": 50 }
        ]
      }
    }
  }
}

Typy pól — tabela referencyjna

Typ pola Użycie Przykład
text Pełnotekstowe wyszukiwanie (analizowane) Tytuł artykułu, opis produktu
keyword Exact match, sorting, aggregations Status, kategoria, email, ID
integer / long / float Liczby, range queries Cena, wiek, liczba sztuk
date Daty i czas, range queries Data publikacji, timestamp
boolean Wartości true/false Dostępny, aktywny
nested Tablice obiektów z relacją Komentarze, atrybuty wariantowe
geo_point Współrzędne GPS, geo queries Lokalizacja firmy, adresy dostawy

Najczęstsze pytania

Ile RAM potrzebuje Elasticsearch na VPS? +
Elasticsearch wymaga minimum 2 GB RAM dla instancji deweloperskiej, ale do produkcji zalecane jest 8-16 GB. Zasada: przydziel JVM heap = 50% dostępnego RAM, ale nie więcej niż 30 GB (powyżej tej wartości JVM traci skompresowane wskaźniki i działa wolniej). Przykład: VPS z 8 GB RAM → ustaw Xms4g -Xmx4g w jvm.options. Reszta RAM (4 GB) jest używana przez system operacyjny i Lucene file cache — co jest celowe i przyspiesza wyszukiwanie.
Czym jest indeks w Elasticsearch i jak go zaprojektować? +
Indeks w Elasticsearch to odpowiednik tabeli w SQL — przechowuje dokumenty JSON o podobnej strukturze. Każdy indeks ma mapping (schemat typów pól) i jest podzielony na primary shardy (domyślnie 1 per indeks) dla równoległości. Projektując indeks: użyj jednego indeksu per typ danych (produkty, zamówienia), dobierz odpowiednie typy pól (keyword dla filtrowania, text dla full-text search), unikaj pola dynamic mapping w produkcji (może prowadzić do mapping explosion). Dla logów użyj indeksów z datą w nazwie (logi-2026-04-10) i ILM do zarządzania cyklem życia.
Jak włączyć security (X-Pack) w Elasticsearch? +
Od Elasticsearch 8.0 security jest domyślnie włączone. W wersjach 7.x musisz dodać do elasticsearch.yml: xpack.security.enabled: true i xpack.security.transport.ssl.enabled: true. Po restarcie uruchom: bin/elasticsearch-setup-passwords auto (generuje hasła dla elastic, kibana, logstash_system i innych). Ustaw zmienną środowiskową ELASTIC_PASSWORD lub użyj Keystore: bin/elasticsearch-keystore add xpack.security.http.ssl.keystore.secure_password. Dla HTTPS skonfiguruj certyfikat TLS w sekcji xpack.security.http.ssl.
Jaka jest różnica między term query a match query? +
term query szuka dokładnej wartości (exact match) bez analizy tekstu — używaj dla pól keyword, liczb, dat. Przykład: term: { "status": "active" }. match query używa analizatora tekstu — rozkłada zapytanie na tokeny, obsługuje stemming, synonimy, fuzzy matching. Używaj dla pól text (pełnotekstowe). Częsty błąd: użycie match na polu keyword zamiast term, lub term na polu text (szuka tokenizowanej wartości zamiast surowej). Ogólna zasada: keyword/bool = term, text/search = match.

Sprawdź oferty pasujące do tego scenariusza

Poniżej masz szybkie przejścia do ofert i stron z kodami rabatowymi tam, gdzie są dostępne.