 Autor: [Adam Nadolny](/autorzy/adam-nadolny) Ekspert DevOps i infrastruktury · Zweryfikowano Kwiecień 2026

1.  [Strona główna](/) ›
2.  [Baza wiedzy](/baza-wiedzy/) ›
3.  Elasticsearch na VPS

# 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.

Contabo

VPS z 8+ GB RAM — minimum dla produkcyjnego Elasticsearch bez swap

VPS 8 GB RAM

[Aktywuj rabat →](/out/contabo)

#Reklama · link partnerski

[Zobacz kod rabatowy →](/kody-rabatowe/contabo)

Mikr.us

Budżetowy VPS do nauki Elasticsearch — tryb dev/single-node

Dev/Test

[Aktywuj rabat →](/out/mikrus)

#Reklama · link partnerski

[Zobacz kod rabatowy →](/kody-rabatowe/mikrus)

LH.pl

Hosting z wbudowaną wyszukiwarką — bez konfiguracji własnego Elasticsearch

Managed Search

[Aktywuj rabat →](/out/lh-pl)

#Reklama · link partnerski

[Zobacz kod rabatowy →](/kody-rabatowe/lh-pl)

## Powiązane strony

-   [Grafana Loki — agregacja logów](/baza-wiedzy/loki-grafana-logi)
-   [Netdata — real-time monitoring VPS](/baza-wiedzy/netdata-monitoring-vps)
-   [Nginx load balancer — konfiguracja](/baza-wiedzy/nginx-load-balancer-konfiguracja)
-   [Wszystkie artykuły](/baza-wiedzy/)