An Elasticsearch Tutorial: Getting Started

#Note: Elastic heeft onlangs aangekondigd dat het closed-source licenties zal implementeren voor nieuwe versies van Elasticsearch en Kibana na versie 7.9. Lees voor meer details het commentaar van onze CEO Tomer Levy op Truly Doubling Down on Open Source.

Elasticsearch is het levende hart van wat vandaag het meest populaire log analytics platform is – de ELK Stack (Elasticsearch, Logstash en Kibana). De rol van Elasticsearch is zo centraal dat het synoniem is geworden met de naam van de stack zelf. Elasticsearch, voornamelijk voor zoek- en loganalyse, is vandaag een van de populairste databasesystemen die vandaag beschikbaar zijn. Deze Elasticsearch tutorial voorziet nieuwe gebruikers van de benodigde kennis en tools om met Elasticsearch aan de slag te gaan. Het bevat installatie instructies, en de eerste indexering en data handling instructies.

Wat is Elasticsearch?

Initieel uitgebracht in 2010, Elasticsearch (soms ES genoemd) is een moderne zoek- en analyse-engine die gebaseerd is op Apache Lucene. Volledig open source en gebouwd met Java, Elasticsearch is een NoSQL database. Dat betekent dat het gegevens opslaat op een ongestructureerde manier en dat je geen SQL kunt gebruiken om het te bevragen.

Deze Elasticsearch tutorial zou ook kunnen worden beschouwd als een NoSQL tutorial. Echter, in tegenstelling tot de meeste NoSQL databases, heeft Elasticsearch een sterke focus op zoekmogelijkheden en -functies – zozeer zelfs, dat de gemakkelijkste manier om gegevens uit ES te halen is door ernaar te zoeken met behulp van de uitgebreide Elasticsearch API.

In de context van data-analyse wordt Elasticsearch gebruikt samen met de andere componenten in de ELK Stack, Logstash en Kibana, en speelt de rol van data-indexering en opslag.

Installeren van Elasticsearch

De vereisten voor Elasticsearch zijn eenvoudig: Java 8 (specifieke versie aanbevolen: Oracle JDK versie 1.8.0_131). Kijk eens naar deze Logstash tutorial om er zeker van te zijn dat u er klaar voor bent. Zorg er ook voor dat je besturingssysteem op de Elastic support matrix staat, anders kun je tegen vreemde en onvoorspelbare problemen aanlopen. Als dat eenmaal gedaan is, kun je beginnen met het installeren van Elasticsearch.

Je kunt Elasticsearch downloaden als een standalone distributie of het installeren met behulp van de apt en yum repositories. We zullen Elasticsearch installeren op een Ubuntu 16.04 machine die draait op AWS EC2 met apt.

Eerst moet je Elastic’s signing key toevoegen zodat je het gedownloade pakket kunt verifiëren (sla deze stap over als je al pakketten van Elastic hebt geïnstalleerd):

wget -qO - https://artifacts.elastic.co/GPG-KEY-elasticsearch | sudo apt-key add -

Voor Debian moeten we dan het apt-transport-https pakket installeren:

sudo apt-get install apt-transport-https

De volgende stap is het toevoegen van de repository definitie aan je systeem:

echo "deb https://artifacts.elastic.co/packages/6.x/apt stable main" | sudo tee -a /etc/apt/sources.list.d/elastic-6.x.list

Het enige wat nog moet gebeuren is het updaten van uw repositories en het installeren van Elasticsearch:

sudo apt-get updatesudo apt-get install elasticsearch

Elasticsearch configureren

Elasticsearch configuraties worden gedaan met behulp van een configuratiebestand waarvan de locatie afhangt van uw besturingssysteem. In dit bestand kunt u algemene instellingen configureren (b.v. node naam), maar ook netwerk instellingen (b.v. host en poort), waar data wordt opgeslagen, geheugen, log bestanden, en meer.

Voor ontwikkeling en test doeleinden, zullen de standaard instellingen voldoende zijn, maar het is aan te raden om wat onderzoek te doen naar welke instellingen u handmatig moet definiëren voordat u in productie gaat.

Bijv. en vooral bij installatie van Elasticsearch in de cloud, is het een goed idee om Elasticsearch te binden aan een private IP of localhost:

sudo vim /etc/elasticsearch/elasticsearch.ymlnetwork.host: "localhost"http.port:9200

Elasticsearch

Elasticsearch wordt na installatie niet automatisch uitgevoerd en moet handmatig worden gestart. Hoe u Elasticsearch uitvoert hangt af van uw specifieke systeem. Op de meeste Linux en Unix gebaseerde systemen kunt u dit commando gebruiken:

sudo service elasticsearch start

En dat is het! Om te bevestigen dat alles goed werkt, richt u curl of uw browser op http://localhost:9200, en u zou iets als de volgende uitvoer moeten zien:

{ "name" : "33QdmXw", "cluster_name" : "elasticsearch", "cluster_uuid" : "mTkBe_AlSZGbX-vDIe_vZQ", "version" : { "number" : "6.1.2", "build_hash" : "5b1fea5", "build_date" : "2018-01-10T02:35:59.208Z", "build_snapshot" : false, "lucene_version" : "7.1.0", "minimum_wire_compatibility_version" : "5.6.0", "minimum_index_compatibility_version" : "5.0.0" }, "tagline" : "You Know, for Search"}

Om het proces van het draaien van Elasticsearch te debuggen, gebruikt u de Elasticsearch logbestanden die zich (op Deb) in /var/log/elasticsearch/ bevinden.

Een Elasticsearch Index

Indexeren is het proces van het toevoegen van data aan Elasticsearch. Dat komt omdat wanneer je gegevens in Elasticsearch invoert, de gegevens in Apache Lucene indexen worden geplaatst. Dit is logisch omdat Elasticsearch de Lucene indexen gebruikt om zijn gegevens op te slaan en op te halen. Hoewel je niet veel van Lucene hoeft te weten, helpt het wel om te weten hoe het werkt als je serieus aan de slag gaat met Elasticsearch.
Elasticsearch gedraagt zich als een REST API, dus je kunt ofwel de POST of de PUT methode gebruiken om er data aan toe te voegen. U gebruikt PUT als u de id van het data-item kent of wilt specificeren, of POST als u wilt dat Elasticsearch een id voor het data-item genereert:

curl -XPOST 'localhost:9200/logs/my_app' -H 'Content-Type: application/json' -d'{ "timestamp": "2018-01-24 12:34:56", "message": "User logged in", "user_id": 4, "admin": false}'curl -X PUT 'localhost:9200/app/users/4' -H 'Content-Type: application/json' -d '{ "id": 4, "username": "john", "last_login": "2018-01-25 12:34:56"}'

En de respons:

{"_index":"logs","_type":"my_app","_id":"ZsWdJ2EBir6MIbMWSMyF","_version":1,"result":"created","_shards":{"total":2,"successful":1,"failed":0},"_seq_no":0,"_primary_term":1}{"_index":"app","_type":"users","_id":"4","_version":1,"result":"created","_shards":{"total":2,"successful":1,"failed":0},"_seq_no":0,"_primary_term":1}

De gegevens voor het document worden verzonden als een JSON-object. Je vraagt je misschien af hoe we gegevens kunnen indexeren zonder de structuur van de gegevens te definiëren. Nou, met Elasticsearch, net als met elke andere NoSQL database, is het niet nodig om de structuur van de data van te voren te definiëren. Maar om optimale prestaties te garanderen, kun je Elasticsearch mappings definiëren op basis van datatypes. Meer hierover later.

Als u een van de Beats shippers (bijv. Filebeat of Metricbeat), of Logstash gebruikt, zullen die delen van de ELK Stack automatisch de indices maken.

Om een lijst van uw Elasticsearch indexen te zien, gebruikt u:

curl -XGET 'localhost:9200/_cat/indices?v&pretty'health status index uuid pri rep docs.count docs.deleted store.size pri.store.sizeyellow open logstash-2018.01.23 y_-PguqyQ02qOqKiO6mkfA 5 1 17279 0 9.9mb 9.9mbyellow open app GhzBirb-TKSUFLCZTCy-xg 5 1 1 0 5.2kb 5.2kbyellow open .kibana Vne6TTWgTVeAHCSgSboa7Q 1 1 2 0 8.8kb 8.8kbyellow open logs T9E6EdbMSxa8S_B7SDabTA 5 1 1 0 5.7kb 5.7kb

De lijst in dit geval bevat de indexen die we hierboven hebben gemaakt, een Kibana index en een index gemaakt door een Logstash pipeline.

Elasticsearch Querying

Zodra u uw data in Elasticsearch heeft geïndexeerd, kunt u beginnen met zoeken en het analyseren ervan. De eenvoudigste query die u kunt uitvoeren is het ophalen van een enkel item. Lees ons artikel dat zich uitsluitend richt op Elasticsearch-query’s.

Opnieuw, via de Elasticsearch REST API, gebruiken we GET:

curl -XGET 'localhost:9200/app/users/4?pretty'

En de respons:

{ "_index" : "app", "_type" : "users", "_id" : "4", "_version" : 1, "found" : true, "_source" : { "id" : 4, "username" : "john", "last_login" : "2018-01-25 12:34:56" }}

De velden die beginnen met een underscore zijn alle meta-velden van het resultaat. Het _source object is het originele document dat werd geïndexeerd.
We gebruiken ook GET om zoekopdrachten uit te voeren door het _search eindpunt aan te roepen:

curl -XGET 'localhost:9200/_search?q=logged'{"took":173,"timed_out":false,"_shards":{"total":16,"successful":16,"skipped":0,"failed":0},"hits":{"total":1,"max_score":0.2876821,"hits":}}

Het resultaat bevat een aantal extra velden die zowel de zoekopdracht als het resultaat beschrijven. Hier volgt een korte opsomming:

  • took: De tijd in milliseconden die de zoekactie in beslag nam
  • timed_out: If the search timed out
  • _shards: Het aantal doorzochte Lucene-shards, en hun succes- en mislukkingspercentages
  • hits: De eigenlijke resultaten, samen met meta-informatie voor de resultaten

De zoekactie die we hierboven deden, staat bekend als een URI-zoekactie, en is de eenvoudigste manier om Elasticsearch te bevragen. Door alleen een woord op te geven, zal ES alle velden van alle documenten doorzoeken op dat woord. U kunt specifieker zoeken door Lucene-query’s te gebruiken:

  • gebruikersnaam:johnb – Zoekt naar documenten waarvan de gebruikersnaam gelijk is aan “johnb”
  • john* – Zoekt naar documenten die termen bevatten die beginnen met john en gevolgd worden door nul of meer tekens, zoals “john,” “johnb,” en “johnson”
  • john? – Zoekt naar documenten die termen bevatten die beginnen met john gevolgd door slechts één teken. Komt overeen met “johnb” en “johns”, maar niet met “john.”

Er zijn nog veel meer manieren om te zoeken, waaronder het gebruik van booleaanse logica, het opvoeren van termen, het gebruik van fuzzy en proximity searches, en het gebruik van reguliere expressies.

Elasticsearch Query DSL

URI-zoekopdrachten zijn slechts het begin. Elasticsearch biedt ook een request body search met een Query DSL voor meer geavanceerde zoekopdrachten. Er is een breed scala aan opties beschikbaar in dit soort zoekopdrachten, en je kunt verschillende opties mixen en matchen om de resultaten te krijgen die je nodig hebt.

Het bevat twee soorten clausules: 1) blad query-clausules die zoeken naar een waarde in een specifiek veld, en 2) samengestelde query-clausules (die een of meerdere blad query-clausules kunnen bevatten).

Elasticsearch Query Types

Er is een breed scala aan opties beschikbaar in dit soort zoekopdrachten, en u kunt verschillende opties mixen en matchen om de resultaten te krijgen die u nodig hebt. Zoektypes omvatten:

  1. Geo queries,
  2. “Meer zoals deze”-query’s
  3. Geregistreerde query’s
  4. Volledige tekst query’s
  5. Vorm query’s
  6. Span query’s
  7. Term-niveau query’s
  8. Gespecialiseerde query’s

Zoals in Elasticsearch 6.8 heeft de ELK Stack Elasticsearch queries en Elasticsearch filters samengevoegd, maar ES onderscheidt ze nog steeds per context. De DSL maakt onderscheid tussen een filter context en een query context voor query clausules. Clausules in een filter context testen documenten op een booleaanse manier: Komt het document overeen met het filter, “ja” of “nee?” Filters zijn over het algemeen ook sneller dan queries, maar queries kunnen ook een relevantie score berekenen op basis van hoe nauw een document overeenkomt met de query. Filters maken geen gebruik van een relevantiescore. Dit bepaalt de volgorde en inclusie van documenten:

curl -XGET 'localhost:9200/logs/_search?pretty' -H 'Content-Type: application/json' -d'{ "query": { "match_phrase": { "message": "User logged in" } }}'

En het resultaat:

{ "took" : 28, "timed_out" : false, "_shards" : { "total" : 5, "successful" : 5, "skipped" : 0, "failed" : 0 }, "hits" : { "total" : 1, "max_score" : 0.8630463, "hits" : }}'

Een Elasticsearch Cluster maken

Het onderhouden van een Elasticsearch cluster kan tijdrovend zijn, vooral als je DIY ELK doet. Maar gezien de krachtige zoek- en analysemogelijkheden van Elasticsearch, zijn zulke clusters onmisbaar. We hebben een diepere duik in het onderwerp met onze Elasticsearch cluster tutorial, dus we zullen dit gebruiken als een springplank voor die meer grondige walk-through.

Wat is een Elasticsearch cluster, precies? Elasticsearch clusters groeperen meerdere Elasticsearch nodes en/of instances bij elkaar. Natuurlijk kunt u er altijd voor kiezen om een enkele Elasticsearch instance of node binnen een bepaald cluster te houden. Het belangrijkste punt van zo’n groepering ligt in de verdeling van taken, zoeken, en indexeren over de nodes van het cluster. Node opties zijn data nodes, master nodes, client nodes, en ingest nodes.

Installatie van nodes kan een hoop configuraties met zich meebrengen, die onze eerder genoemde tutorial behandelt. Maar hier is de basis Elasticsearch cluster node installatie:

Installeer eerst en vooral Java:

sudo apt-get install default-jre

Volgende, voeg Elasticsearch’s sign-in key toe:

wget -qO - https://artifacts.elastic.co/GPG-KEY-elasticsearch | sudo apt-key add -

Volgende, installeer de nieuwe iteratie van Elasticsearch:

sudo apt-get update && apt-get install elasticsearch

U zult van elke Elasticsearch node een eigen elasticsearch.yml config bestand moeten maken en/of instellen (sudo vim /etc/elasticsearch/elasticsearch.yml). Start van daaruit Elasticsearch en controleer de status van uw Elasticsearch-cluster. Reacties zullen er ongeveer zo uitzien:

{ "cluster_name" : "elasticsearch-cluster-demo", "compressed_size_in_bytes" : 255, "version" : 7, "state_uuid" : "50m3ranD0m54a531D", "master_node" : "IwEK2o1-Ss6mtx50MripkA", "blocks" : { }, "nodes" : { "m4-aw350m3-n0D3" : { "name" : "es-node-1", "ephemeral_id" : "x50m33F3mr--A11DnuM83r", "transport_address" : "172.31.50.123:9200", "attributes" : { } }, },}

Elasticsearch cluster gezondheid zal de volgende zijn op uw lijst. Controleer periodiek de gezondheid van uw cluster met de volgende API-aanroep:

curl -X GET "localhost:9200/_cluster/health?wait_for_status=yellow&local=false&level=shards&pretty"

Dit voorbeeld toont de parameter local als false, (wat eigenlijk standaard is). Dit zal je de status van de master node laten zien. Om de lokale node te controleren, verander naar true.

De level parameter zal, standaard, u cluster gezondheid laten zien, maar rangen daarboven zijn indices en shards (zoals in het bovenstaande voorbeeld).

Er zijn extra optionele parameters voor time-outs…

timeout
master_timeout

…of om te wachten tot bepaalde gebeurtenissen zich voordoen:

wait_for_active_shards
wait_for_events
wait_for_no_initializing_shards
wait_for_no_relocating_shards
wait_for_nodes
wait_for_status

Elasticsearch-gegevens verwijderen

Het verwijderen van items uit Elasticsearch is net zo eenvoudig als het invoeren van gegevens in Elasticsearch. De HTTP methode om deze keer te gebruiken is – verrassing, verrassing –DELETE:

$ curl -XDELETE 'localhost:9200/app/users/4?pretty'{ "_index" : "app", "_type" : "users", "_id" : "4", "_version" : 2, "result" : "deleted", "_shards" : { "total" : 2, "successful" : 1, "failed" : 0 }, "_seq_no" : 1, "_primary_term" : 1}

Om een index te verwijderen, gebruik:

$ curl -XDELETE 'localhost:9200/logs?pretty'

Om alle indices te verwijderen (gebruik met uiterste voorzichtigheid) gebruik:

$ curl -XDELETE 'localhost:9200/_all?pretty'$

Het antwoord in beide gevallen zou moeten zijn:

{ "acknowledged" : true}

Om een enkel document te verwijderen:

$ curl -XDELETE 'localhost:9200/index/type/document'

What’s Next?

Deze tutorial helpt beginners met Elasticsearch en geeft als zodanig slechts de basisstappen van CRUD operaties in Elasticsearch. Elasticsearch is een zoekmachine, en als zodanig heeft het een enorme diepte in zijn zoekfuncties.
De recente versies hebben een aantal ongelooflijke nieuwe Elasticsearch-functies geïntroduceerd en ook een aantal belangrijke wijzigingen in de onderliggende datastructuur.

Het is altijd een goed idee om de officiële Elasticsearch-documentatie te verkennen, evenals onze Logstash-tutorial en Kibana-tutorial.

Geef een antwoord

Het e-mailadres wordt niet gepubliceerd.