Elasticsearch Cheatsheet: Podstawowe polecenia i wskazówki
Polecenia Elasticsearch do wyszukiwania, indeksowania i analizy
Elasticsearch to potężny rozproszony silnik wyszukiwania i analizy danych oparty na Apache Lucene. Ta kompletna lista poleceń obejmuje istotne polecenia, najlepsze praktyki oraz szybkie odniesienia do pracy z klastrami Elasticsearch.

Uwaga: Większość przykładów w tym przewodniku korzysta z cURL do żądań HTTP. Jeśli jesteś nowy w cURL lub potrzebujesz szybkiego odniesienia do zaawansowanych opcji, sprawdź naszą Listę poleceń cURL dla szczegółowych technik żądań HTTP w wierszu poleceń.
Zarządzanie Klastrami
Sprawdzenie Stanu Klastra
Wszystkie polecenia w tej sekcji korzystają z cURL do interakcji z REST API Elasticsearch. Możesz dostosować te żądania dodatkowymi nagłówkami, autoryzacją i innymi opcjami, jeśli to konieczne.
# Podstawowe sprawdzenie stanu
curl -X GET "localhost:9200/_cluster/health?pretty"
# Szczegółowy stan klastra z informacjami o fragmentach
curl -X GET "localhost:9200/_cluster/health?level=shards&pretty"
# Sprawdzenie informacji o węzłach
curl -X GET "localhost:9200/_cat/nodes?v"
# Sprawdzenie ustawień klastra
curl -X GET "localhost:9200/_cluster/settings?pretty"
Operacje na Węzłach
# Lista wszystkich węzłów
curl -X GET "localhost:9200/_cat/nodes?v&h=name,node.role,heap.percent,ram.percent,cpu,load_1m"
# Statystyki węzła
curl -X GET "localhost:9200/_nodes/stats?pretty"
# Ciepłe wątki (rozwiązywanie problemów)
curl -X GET "localhost:9200/_nodes/hot_threads"
Zarządzanie Indeksami
Tworzenie i Usuwanie Indeksów
# Tworzenie indeksu
curl -X PUT "localhost:9200/my_index?pretty"
# Tworzenie indeksu z ustawieniami
curl -X PUT "localhost:9200/my_index" -H 'Content-Type: application/json' -d'
{
"settings": {
"number_of_shards": 3,
"number_of_replicas": 1
}
}
'
# Usuwanie indeksu
curl -X DELETE "localhost:9200/my_index?pretty"
# Lista wszystkich indeksów
curl -X GET "localhost:9200/_cat/indices?v"
# Statystyki indeksu
curl -X GET "localhost:9200/my_index/_stats?pretty"
Mapowania Indeksów
# Definiowanie mapowania
curl -X PUT "localhost:9200/products" -H 'Content-Type: application/json' -d'
{
"mappings": {
"properties": {
"name": { "type": "text" },
"price": { "type": "float" },
"created_at": { "type": "date" },
"tags": { "type": "keyword" },
"description": {
"type": "text",
"analyzer": "english"
}
}
}
}
'
# Pobranie mapowania
curl -X GET "localhost:9200/products/_mapping?pretty"
# Aktualizacja mapowania (dodanie pola)
curl -X PUT "localhost:9200/products/_mapping" -H 'Content-Type: application/json' -d'
{
"properties": {
"category": { "type": "keyword" }
}
}
'
Szablony Indeksów
# Tworzenie szablonu indeksu
curl -X PUT "localhost:9200/_index_template/logs_template" -H 'Content-Type: application/json' -d'
{
"index_patterns": ["logs-*"],
"template": {
"settings": {
"number_of_shards": 1
},
"mappings": {
"properties": {
"timestamp": { "type": "date" },
"message": { "type": "text" },
"level": { "type": "keyword" }
}
}
}
}
'
# Lista szablonów
curl -X GET "localhost:9200/_index_template?pretty"
Operacje na Dokumentach (CRUD)
Tworzenie Dokumentów
# Indeksowanie dokumentu z automatycznie wygenerowanym ID
curl -X POST "localhost:9200/products/_doc?pretty" -H 'Content-Type: application/json' -d'
{
"name": "Laptop",
"price": 999.99,
"tags": ["electronics", "computers"]
}
'
# Indeksowanie dokumentu z określonym ID
curl -X PUT "localhost:9200/products/_doc/1?pretty" -H 'Content-Type: application/json' -d'
{
"name": "Laptop",
"price": 999.99
}
'
# Indeksowanie w trybie wsadowym
curl -X POST "localhost:9200/_bulk?pretty" -H 'Content-Type: application/json' -d'
{ "index": { "_index": "products", "_id": "1" }}
{ "name": "Laptop", "price": 999.99 }
{ "index": { "_index": "products", "_id": "2" }}
{ "name": "Mouse", "price": 29.99 }
'
Odczyt Dokumentów
# Pobranie dokumentu według ID
curl -X GET "localhost:9200/products/_doc/1?pretty"
# Pobranie wielu dokumentów
curl -X GET "localhost:9200/_mget?pretty" -H 'Content-Type: application/json' -d'
{
"docs": [
{ "_index": "products", "_id": "1" },
{ "_index": "products", "_id": "2" }
]
}
'
# Sprawdzenie, czy dokument istnieje
curl -I "localhost:9200/products/_doc/1"
Aktualizacja Dokumentów
# Aktualizacja dokumentu
curl -X POST "localhost:9200/products/_update/1?pretty" -H 'Content-Type: application/json' -d'
{
"doc": {
"price": 899.99
}
}
'
# Aktualizacja za pomocą skryptu
curl -X POST "localhost:9200/products/_update/1?pretty" -H 'Content-Type: application/json' -d'
{
"script": {
"source": "ctx._source.price *= params.discount",
"params": {
"discount": 0.9
}
}
}
'
# Aktualizacja lub wstawienie (update or insert)
curl -X POST "localhost:9200/products/_update/1?pretty" -H 'Content-Type: application/json' -d'
{
"doc": {
"price": 899.99
},
"doc_as_upsert": true
}
'
Usuwanie Dokumentów
# Usuwanie według ID
curl -X DELETE "localhost:9200/products/_doc/1?pretty"
# Usuwanie według zapytania
curl -X POST "localhost:9200/products/_delete_by_query?pretty" -H 'Content-Type: application/json' -d'
{
"query": {
"match": {
"name": "old"
}
}
}
'
Zapytania Wyszukiwania
Podstawowe Wyszukiwanie
# Dopasowanie wszystkich
curl -X GET "localhost:9200/products/_search?pretty" -H 'Content-Type: application/json' -d'
{
"query": {
"match_all": {}
}
}
'
# Zapytanie dopasowania
curl -X GET "localhost:9200/products/_search?pretty" -H 'Content-Type: application/json' -d'
{
"query": {
"match": {
"name": "laptop"
}
}
}
'
# Zapytanie wielokrotnego dopasowania
curl -X GET "localhost:9200/products/_search?pretty" -H 'Content-Type: application/json' -d'
{
"query": {
"multi_match": {
"query": "laptop gaming",
"fields": ["name", "description"]
}
}
}
'
Zapytania na Poziomie Terminów
# Zapytanie term (dokładne dopasowanie)
curl -X GET "localhost:9200/products/_search?pretty" -H 'Content-Type: application/json' -d'
{
"query": {
"term": {
"tags": "electronics"
}
}
}
'
# Zapytanie terms (wiele wartości)
curl -X GET "localhost:9200/products/_search?pretty" -H 'Content-Type: application/json' -d'
{
"query": {
"terms": {
"tags": ["electronics", "computers"]
}
}
}
'
# Zapytanie zakresu
curl -X GET "localhost:9200/products/_search?pretty" -H 'Content-Type: application/json' -d'
{
"query": {
"range": {
"price": {
"gte": 100,
"lte": 1000
}
}
}
}
'
# Zapytanie istnienia
curl -X GET "localhost:9200/products/_search?pretty" -H 'Content-Type: application/json' -d'
{
"query": {
"exists": {
"field": "description"
}
}
}
'
Zapytania Boolean
# Zapytanie bool (musi, powinien, nie musi, filtr)
curl -X GET "localhost:9200/products/_search?pretty" -H 'Content-Type: application/json' -d'
{
"query": {
"bool": {
"must": [
{ "match": { "name": "laptop" }}
],
"filter": [
{ "range": { "price": { "gte": 500 }}}
],
"should": [
{ "term": { "tags": "gaming" }}
],
"must_not": [
{ "term": { "tags": "refurbished" }}
]
}
}
}
'
Zaawansowane Wyszukiwanie
# Zapytanie typu Wildcard
curl -X GET "localhost:9200/products/_search?pretty" -H 'Content-Type: application/json' -d'
{
"query": {
"wildcard": {
"name": "lap*"
}
}
}
'
# Zapytanie fuzzy (tolerancja na błędy ortograficzne)
curl -X GET "localhost:9200/products/_search?pretty" -H 'Content-Type: application/json' -d'
{
"query": {
"fuzzy": {
"name": {
"value": "laptpo",
"fuzziness": "AUTO"
}
}
}
}
'
# Zapytanie prefix
curl -X GET "localhost:9200/products/_search?pretty" -H 'Content-Type: application/json' -d'
{
"query": {
"prefix": {
"name": "lap"
}
}
}
'
Agregacje
Agregacje Metryczne
# Średnia, suma, minimum, maksimum
curl -X GET "localhost:9200/products/_search?pretty" -H 'Content-Type: application/json' -d'
{
"size": 0,
"aggs": {
"avg_price": { "avg": { "field": "price" }},
"max_price": { "max": { "field": "price" }},
"min_price": { "min": { "field": "price" }},
"total_sales": { "sum": { "field": "price" }}
}
}
'
# Agregacja statystyczna
curl -X GET "localhost:9200/products/_search?pretty" -H 'Content-Type: application/json' -d'
{
"size": 0,
"aggs": {
"price_stats": {
"stats": { "field": "price" }
}
}
}
'
Agregacje Grupujące
# Agregacja terms (grupowanie)
curl -X GET "localhost:9200/products/_search?pretty" -H 'Content-Type: application/json' -d'
{
"size": 0,
"aggs": {
"popular_tags": {
"terms": {
"field": "tags",
"size": 10
}
}
}
}
'
# Agregacja zakresu
curl -X GET "localhost:9200/products/_search?pretty" -H 'Content-Type: application/json' -d'
{
"size": 0,
"aggs": {
"price_ranges": {
"range": {
"field": "price",
"ranges": [
{ "to": 50 },
{ "from": 50, "to": 100 },
{ "from": 100 }
]
}
}
}
}
'
# Histogram dat
curl -X GET "localhost:9200/logs/_search?pretty" -H 'Content-Type: application/json' -d'
{
"size": 0,
"aggs": {
"logs_over_time": {
"date_histogram": {
"field": "timestamp",
"calendar_interval": "day"
}
}
}
}
'
Agregacje Zagnieżdżone
# Zagnieżdżone agregacje
curl -X GET "localhost:9200/products/_search?pretty" -H 'Content-Type: application/json' -d'
{
"size": 0,
"aggs": {
"categories": {
"terms": { "field": "category" },
"aggs": {
"avg_price": {
"avg": { "field": "price" }
}
}
}
}
}
'
Sortowanie i Paginacja
# Sortowanie według pola
curl -X GET "localhost:9200/products/_search?pretty" -H 'Content-Type: application/json' -d'
{
"query": { "match_all": {} },
"sort": [
{ "price": { "order": "desc" }},
{ "_score": { "order": "desc" }}
]
}
'
# Paginacja z użyciem from/size
curl -X GET "localhost:9200/products/_search?pretty" -H 'Content-Type: application/json' -d'
{
"from": 0,
"size": 10,
"query": { "match_all": {} }
}
'
# Paginacja search_after (dla głębszej paginacji)
curl -X GET "localhost:9200/products/_search?pretty" -H 'Content-Type: application/json' -d'
{
"size": 10,
"query": { "match_all": {} },
"sort": [{ "price": "asc" }, { "_id": "asc" }],
"search_after": [100, "product_123"]
}
'
Wybór Pól i Podświetlanie
# Wybór konkretnych pól
curl -X GET "localhost:9200/products/_search?pretty" -H 'Content-Type: application/json' -d'
{
"query": { "match_all": {} },
"_source": ["name", "price"]
}
'
# Podświetlanie
curl -X GET "localhost:9200/products/_search?pretty" -H 'Content-Type: application/json' -d'
{
"query": {
"match": { "description": "gaming laptop" }
},
"highlight": {
"fields": {
"description": {}
}
}
}
'
Aliasy Indeksów
# Tworzenie aliasu
curl -X POST "localhost:9200/_aliases?pretty" -H 'Content-Type: application/json' -d'
{
"actions": [
{ "add": { "index": "products_v1", "alias": "products" }}
]
}
'
# Przełączenie aliasu na nowy indeks (bez czasu przestoju)
curl -X POST "localhost:9200/_aliases?pretty" -H 'Content-Type: application/json' -d'
{
"actions": [
{ "remove": { "index": "products_v1", "alias": "products" }},
{ "add": { "index": "products_v2", "alias": "products" }}
]
}
'
# Lista aliasów
curl -X GET "localhost:9200/_cat/aliases?v"
Reindeksacja
# Reindeksacja z jednego indeksu do drugiego
curl -X POST "localhost:9200/_reindex?pretty" -H 'Content-Type: application/json' -d'
{
"source": {
"index": "old_products"
},
"dest": {
"index": "new_products"
}
}
'
# Reindeksacja z zapytaniem
curl -X POST "localhost:9200/_reindex?pretty" -H 'Content-Type: application/json' -d'
{
"source": {
"index": "products",
"query": {
"range": {
"price": { "gte": 100 }
}
}
},
"dest": {
"index": "expensive_products"
}
}
'
Zdjęcia i Kopie Zapasowe
# Rejestrowanie repozytorium kopii zapasowych
curl -X PUT "localhost:9200/_snapshot/my_backup?pretty" -H 'Content-Type: application/json' -d'
{
"type": "fs",
"settings": {
"location": "/mount/backups/my_backup"
}
}
'
# Tworzenie kopii zapasowej
curl -X PUT "localhost:9200/_snapshot/my_backup/snapshot_1?wait_for_completion=true&pretty"
# Przywracanie kopii zapasowej
curl -X POST "localhost:9200/_snapshot/my_backup/snapshot_1/_restore?pretty"
# Lista kopii zapasowych
curl -X GET "localhost:9200/_snapshot/my_backup/_all?pretty"
# Usuwanie kopii zapasowej
curl -X DELETE "localhost:9200/_snapshot/my_backup/snapshot_1?pretty"
Optymalizacja Wydajności
Ustawienia Indeksu
# Wyłączenie odświeżania podczas indeksowania wsadowego
curl -X PUT "localhost:9200/products/_settings?pretty" -H 'Content-Type: application/json' -d'
{
"index": {
"refresh_interval": "-1"
}
}
'
# Włączenie ponownie po indeksowaniu wsadowym
curl -X PUT "localhost:9200/products/_settings?pretty" -H 'Content-Type: application/json' -d'
{
"index": {
"refresh_interval": "1s"
}
}
'
# Przemoczenie (optymalizacja)
curl -X POST "localhost:9200/products/_forcemerge?max_num_segments=1&pretty"
Czyszczenie Pamięci
# Wyczyszczenie wszystkich pamięci
curl -X POST "localhost:9200/_cache/clear?pretty"
# Wyczyszczenie konkretnej pamięci
curl -X POST "localhost:9200/products/_cache/clear?query=true&pretty"
Monitorowanie i Rozwiązywanie Problemów
# Oczekujące zadania
curl -X GET "localhost:9200/_cat/pending_tasks?v"
# Statystyki puli wątków
curl -X GET "localhost:9200/_cat/thread_pool?v"
# Informacje o segmentach
curl -X GET "localhost:9200/_cat/segments?v"
# Informacje o odzyskiwaniu
curl -X GET "localhost:9200/_cat/recovery?v&h=index,stage,time"
# Interfejs API zadań
curl -X GET "localhost:9200/_tasks?detailed=true&pretty"
Przykłady Klienta Pythona
from elasticsearch import Elasticsearch
# Połączenie z Elasticsearch
es = Elasticsearch(['http://localhost:9200'])
# Indeksowanie dokumentu
doc = {
'name': 'Laptop',
'price': 999.99,
'tags': ['electronics']
}
es.index(index='products', id=1, document=doc)
# Wyszukiwanie
resp = es.search(index='products', query={'match': {'name': 'laptop'}})
for hit in resp['hits']['hits']:
print(hit['_source'])
# Indeksowanie wsadowe
from elasticsearch.helpers import bulk
actions = [
{
'_index': 'products',
'_id': i,
'_source': {'name': f'Product {i}', 'price': i * 10}
}
for i in range(1000)
]
bulk(es, actions)
Przykłady Klienta JavaScript/Node.js
Klient JavaScript Elasticsearch oferuje bezpieczny pod względem typów sposób na interakcję z Twoim klastrem. Dla aplikacji produkcyjnych rozważ użycie TypeScriptu dla lepszej bezpieczeństwa typów i autouzupełniania. Zobacz naszą Listę poleceń TypeScript dla najlepszych praktyk dotyczących definicji typów i interfejsów.
const { Client } = require('@elastic/elasticsearch');
const client = new Client({ node: 'http://localhost:9200' });
// Indeksowanie dokumentu
async function indexDoc() {
await client.index({
index: 'products',
id: 1,
document: {
name: 'Laptop',
price: 999.99
}
});
}
// Wyszukiwanie
async function search() {
const result = await client.search({
index: 'products',
query: {
match: { name: 'laptop' }
}
});
console.log(result.hits.hits);
}
// Indeksowanie wsadowe
async function bulkIndex() {
const operations = [];
for (let i = 0; i < 1000; i++) {
operations.push({ index: { _index: 'products', _id: i } });
operations.push({ name: `Product ${i}`, price: i * 10 });
}
await client.bulk({ operations });
}
Przykład TypeScript z Silnym Typowaniem
import { Client } from '@elastic/elasticsearch';
interface Product {
name: string;
price: number;
tags?: string[];
created_at?: Date;
}
const client = new Client({ node: 'http://localhost:9200' });
async function indexProduct(product: Product, id: number): Promise<void> {
await client.index<Product>({
index: 'products',
id: id.toString(),
document: product
});
}
async function searchProducts(query: string): Promise<Product[]> {
const result = await client.search<Product>({
index: 'products',
query: {
match: { name: query }
}
});
return result.hits.hits.map(hit => hit._source as Product);
}
Najlepsze Praktyki
Projektowanie Indeksów
- Utrzymuj rozmiar fragmentu między 20 a 50 GB dla optymalnej wydajności
- Używaj zarządzania cyklem życia indeksów (ILM) dla danych serii czasowych
- Starannie projektuj mapowania przed indeksowaniem danych
- Używaj odpowiednich typów pól (keyword vs text, formaty dat)
- Wyłącz
_sourcedla dużych dokumentów, jeśli nie jest to konieczne
Optymalizacja Zapytań
- Używaj filtrów zamiast zapytań, jeśli nie jest potrzebne ocenianie
- Preferuj zapytania na poziomie terminów dla danych strukturalnych
- Używaj
booldo efektywnego łączenia wielu warunków - Implementuj paginację z
search_afterdla głębszej paginacji - Kachuj często używane filtry
Wydajność Indeksowania
- Używaj API wsadowego do indeksowania wsadowego (1000-5000 dokumentów na żądanie)
- Wyłącz odświeżanie podczas operacji wsadowych
- Zwiększ
index.refresh_intervalpodczas intensywnego indeksowania - Używaj wielu wątków/pracowników do indeksowania równoległego
- Rozważ użycie routingu dla lepszego rozdzielania fragmentów
Zarządzanie Klastrem
- Regularnie monitoruj stan klastra
- Ustaw odpowiednią konfigurację replik
- Używaj dedykowanych węzłów głównych dla dużych klastrów
- Zaimplementuj odpowiednią strategię kopii zapasowych z użyciem kopii zapasowych
- Monitoruj użycie pamięci JVM (utrzymuj poniżej 75%)
Bezpieczeństwo
- Włącz autoryzację i autoryzację (X-Pack Security)
- Używaj HTTPS w wersji produkcyjnej (skonfiguruj cURL z opcjami
--cacert,--certi--keydla SSL/TLS) - Zaimplementuj odpowiednią kontrolę dostępu opartą na rolach
- Regularne aktualizacje i poprawki bezpieczeństwa
- Szyfrowanie danych w spoczynku i w trakcie przesyłania
Typowe Przypadki Użycia
Pełnotekstowe Wyszukiwanie
Elasticsearch wyróżnia się w pełnotekstowym wyszukiwaniu dzięki funkcjom takim jak:
- Ocena ważności
- Dopasowanie z tolerancją błędów ortograficznych
- Dopasowanie frazy
- Obsługa synonimów
- Wsparcie dla wielu języków
Analiza Logów (Stos ELK)
- Zbieranie logów za pomocą Logstash/Filebeat
- Indeksowanie i wyszukiwanie logów w Elasticsearch
- Wizualizacja w Kibana
- Ustawianie alertów na anomalie
Wyszukiwanie w E-commerce
- Wyszukiwanie katalogu produktów
- Nawigacja z filtrem za pomocą agregacji
- Autouzupełnianie i sugestie
- Personalizowane wyniki wyszukiwania
Monitorowanie Wydajności Aplikacji
- Indeksowanie metryk aplikacji
- Pulpity nawigacyjne monitorowania w czasie rzeczywistym
- Wykrywanie anomalii
- Analiza trendów wydajności
Przydatne Linki
Oficjalne Zasoby Elasticsearch
- Oficjalna Dokumentacja Elasticsearch
- Referencja API Elasticsearch
- Przewodnik po Query DSL
- Python Client Elasticsearch
- JavaScript Client Elasticsearch
- Omówienie Elastic Stack
- Optymalizacja wydajności Elasticsearch
- Zarządzanie cyklem życia indeksów
Powiązane Listy Poleceń i Przewodniki
- Listę poleceń cURL - Niezwykle przydatna do opanowania żądań HTTP do REST API Elasticsearch
- Listę poleceń TypeScript: Podstawowe pojęcia i najlepsze praktyki - Buduj aplikacje klienta Elasticsearch z bezpieczeństwem typów