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 |