An Elasticsearch Tutorial: Getting Started

#Huomautus: Elastic ilmoitti hiljattain ottavansa käyttöön suljetun lähdekoodin lisensoinnin Elasticsearchin ja Kibanan uusien versioiden osalta version 7.9 jälkeen. Lue lisätietoja toimitusjohtajamme Tomer Levyn kommentista Truly Doubling Down on Open Source.

Elasticsearch on nykyisin suosituimman lokianalytiikka-alustan eli ELK-pinon (Elasticsearch, Logstash ja Kibana) elävä sydän. Elasticsearchin rooli on niin keskeinen, että siitä on tullut synonyymi itse pinon nimelle. Ensisijaisesti hakuun ja lokianalyysiin tarkoitettu Elasticsearch on nykyään yksi suosituimmista tietokantajärjestelmistä. Tämä Elasticsearch-opas antaa uusille käyttäjille tarvittavat tiedot ja työkalut Elasticsearchin käytön aloittamiseen. Se sisältää asennusohjeet sekä alustavat indeksointi- ja tietojenkäsittelyohjeet.

Mikä on Elasticsearch?

Alun perin vuonna 2010 julkaistu Elasticsearch (joskus nimellä ES) on nykyaikainen haku- ja analyysimoottori, joka perustuu Apache Luceneen. Täysin avoimen lähdekoodin ja Javan avulla rakennettu Elasticsearch on NoSQL-tietokanta. Se tarkoittaa, että se tallentaa dataa strukturoimattomasti ja että sitä ei voi kysyä SQL:llä.

Tätä Elasticsearch-opasohjelmaa voisi pitää myös NoSQL-opasohjelmana. Toisin kuin useimmat NoSQL-tietokannat, Elasticsearch keskittyy kuitenkin vahvasti hakuominaisuuksiin ja -ominaisuuksiin – itse asiassa niin paljon, että helpoin tapa saada tietoja ES:stä on hakea niitä käyttämällä laajaa Elasticsearchin API:ta.

Data-analyysin yhteydessä Elasticsearchia käytetään yhdessä ELK-pinon muiden komponenttien, Logstashin ja Kibanan, kanssa, ja sillä on datan indeksoinnin ja tallennuksen rooli.

Elasticsearchin asentaminen

Elasticsearchin vaatimukset ovat yksinkertaiset: Java 8 (suositeltu erityisversio: Oracle JDK versio 1.8.0_131). Tutustu tähän Logstash-oppaaseen varmistaaksesi, että olet valmis. Varmista myös, että käyttöjärjestelmäsi on Elasticin tukimatriisissa, muuten saatat törmätä outoihin ja arvaamattomiin ongelmiin. Kun tämä on tehty, voit aloittaa asentamalla Elasticsearchin.

Voit ladata Elasticsearchin itsenäisenä jakeluna tai asentaa sen apt– ja yum-arkistojen avulla. Asennamme Elasticsearchin Ubuntu 16.04 -koneeseen, joka toimii AWS EC2:ssa käyttäen apt.

Ensin sinun on lisättävä Elasticin allekirjoitusavain, jotta voit tarkistaa ladatun paketin (ohita tämä vaihe, jos olet jo asentanut paketteja Elasticista):

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

Debianissa meidän on sitten asennettava apt-transport-https-paketti:

sudo apt-get install apt-transport-https

Seuraavaksi sinun on lisättävä repository-määrittely järjestelmään:

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

Väliin jää enää arkistojen päivittäminen ja Elasticsearchin asentaminen:

sudo apt-get updatesudo apt-get install elasticsearch

Elasticsearchin konfigurointi

Elasticsearchin konfigurointi tehdään konfiguraatiotiedoston avulla, jonka sijainti riippuu käyttöjärjestelmästäsi. Tässä tiedostossa voit määrittää yleiset asetukset (esim. solmun nimi) sekä verkkoasetukset (esim. isäntä ja portti), datan tallennuspaikan, muistin, lokitiedostot ja paljon muuta.

Kehitys- ja testaustarkoituksiin oletusasetukset riittävät, mutta silti on suositeltavaa tutkia, mitkä asetukset kannattaa määritellä manuaalisesti ennen tuotantoon siirtymistä.

Elasticsearchin sitominen joko yksityiseen IP-osoitteeseen tai localhostiin on esimerkiksi, ja varsinkin jos Elasticsearch asennetaan pilvipalveluun, hyvä käytäntö:

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

Elasticsearchin käynnistäminen

Elasticsearch ei käynnisty automaattisesti asennuksen jälkeen, vaan se on käynnistettävä manuaalisesti. Se, miten Elasticsearchia ajetaan, riippuu omasta järjestelmästäsi. Useimmissa Linux- ja Unix-pohjaisissa järjestelmissä voit käyttää tätä komentoa:

sudo service elasticsearch start

Ja se on siinä! Vahvistaaksesi, että kaikki toimii hyvin, osoita curl tai selaimesi osoitteeseen http://localhost:9200, ja sinun pitäisi nähdä jotain seuraavan kaltaista tulostetta:

{ "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"}

Käyttääksesi Elasticsearchin ajoprosessin virheenkorjausta voit käyttää Elasticsearchin lokitiedostoja, jotka sijaitsevat (Deb-järjestelmässä) osoitteessa /var/log/elasticsearch/.

Elasticsearch-indeksin luominen

Indexointi on prosessi, jossa tietoja lisätään Elasticsearchiin. Tämä johtuu siitä, että kun syötät dataa Elasticsearchiin, data sijoitetaan Apache Lucene -indekseihin. Tämä on järkevää, koska Elasticsearch käyttää Lucene-indeksejä tietojen tallentamiseen ja hakemiseen. Vaikka sinun ei tarvitse tietää paljonkaan Lucene-indeksistä, on kuitenkin hyödyllistä tietää, miten se toimii, kun alat tosissasi paneutua Elasticsearchiin.
Elasticsearch käyttäytyy kuin REST API, joten voit käyttää joko POST– tai PUT-menetelmää tietojen lisäämiseen siihen. Käytät PUT, kun tiedät tai haluat määrittää tietoelementin id, tai POST, jos haluat Elasticsearchin generoivan id tietoelementille:

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"}'

Ja vastaus:

{"_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}

Dokumentin tiedot lähetetään JSON-objektina. Saatat ihmetellä, miten voimme indeksoida dataa määrittelemättä datan rakennetta. No, Elasticsearchin, kuten minkä tahansa muunkin NoSQL-tietokannan kanssa, datan rakennetta ei tarvitse määritellä etukäteen. Optimaalisen suorituskyvyn varmistamiseksi voit kuitenkin määritellä Elasticsearchin kartoitukset tietotyyppien mukaan. Tästä lisää myöhemmin.

Jos käytät jotain Beats-shipperia (esim. Filebeat tai Metricbeat) tai Logstashia, nämä ELK Stackin osat luovat indeksit automaattisesti.

Luettelon Elasticsearch-indekseistä saat näkyviin seuraavasti:

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

Luettelo sisältää tässä tapauksessa edellä luodut indeksit, Kibana-indeksin ja Logstash-putken luoman indeksin.

Elasticsearch-kysely

Kun olet indeksoinut datasi Elasticsearchiin, voit aloittaa sen etsimisen ja analysoinnin. Yksinkertaisin kysely, jonka voit tehdä, on hakea yksittäinen kohde. Lue artikkelimme, joka keskittyy yksinomaan Elasticsearch-kyselyihin.

Kertaalleen Elasticsearchin REST API:n kautta käytämme GET:

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

Ja vastaus:

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

Kentät, jotka alkavat alleviivauksella, ovat kaikki tuloksen metakenttiä. _source-objekti on alkuperäinen dokumentti, joka indeksoitiin.
Käytämme GET:tä myös hakujen tekemiseen kutsumalla _search-päätepistettä:

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":}}

Tulos sisältää useita ylimääräisiä kenttiä, jotka kuvaavat sekä hakua että tulosta. Tässä on lyhyt yhteenveto:

  • took: Aika millisekunneissa, jonka haku kesti
  • timed_out: If the search timed out
  • _shards: Haun kohteena olleiden Lucene-shardien määrä sekä niiden onnistumis- ja epäonnistumisprosentit
  • hits: Varsinaiset tulokset sekä tulosten metatiedot

Edellä tekemämme haku tunnetaan nimellä URI-haku, ja se on yksinkertaisin tapa tehdä kysely Elasticsearchiin. Kun annat vain sanan, ES hakee kyseisen sanan kaikkien dokumenttien kaikista kentistä. Voit tehdä tarkempia hakuja käyttämällä Lucene-kyselyjä:

  • käyttäjätunnus:johnb – Etsitään dokumentteja, joissa käyttäjätunnus-kenttä on yhtä suuri kuin ”johnb”
  • john* – Etsitään dokumentteja, jotka sisältävät termejä, jotka alkavat sanalla john ja joita seuraa nolla tai useampi merkki, kuten ”john”, ”johnb” ja ”johnson”
  • john? – Etsii asiakirjoja, jotka sisältävät termejä, jotka alkavat sanalla john ja joita seuraa vain yksi merkki. Sopii ”johnb” ja ”johns” mutta ei ”john”.

On monia muitakin tapoja tehdä hakuja, kuten boolen logiikan käyttö, termien tehostaminen, sumeiden ja läheisyyshakujen käyttö sekä säännöllisten lausekkeiden käyttö.

Elasticsearch Query DSL

URI-haut ovat vasta alkua. Elasticsearch tarjoaa myös Request Body -haun Query DSL:llä kehittyneempiä hakuja varten. Tällaisissa hauissa on käytettävissä laaja valikoima vaihtoehtoja, ja voit yhdistellä eri vaihtoehtoja saadaksesi haluamasi tulokset.

Se sisältää kahdenlaisia lausekkeita: 1) lehtikyselylausekkeet, jotka etsivät arvoa tietystä kentästä, ja 2) yhdistetyt kyselylausekkeet (jotka voivat sisältää yhden tai useamman lehtikyselylausekkeen).

Elasticsearch-kyselytyypit

Tämäntyyppisissä hauissa on käytettävissä laaja valikoima vaihtoehtoja, ja voit yhdistellä eri vaihtoehtoja haluamiesi tulosten saamiseksi. Kyselytyyppejä ovat mm:

  1. Geokyselyt,
  2. ”More like this”-kyselyt
  3. Skriptatut kyselyt
  4. Täystekstikyselyt
  5. Muotokyselyt
  6. Välilehtikyselyt
  7. Termitason kyselyt
  8. Erikoistetut kyselyt

As of Elasticsearch 6.8, ELK Stack on yhdistänyt Elasticsearch-kyselyt ja Elasticsearch-suodattimet, mutta ES erottaa ne edelleen kontekstin mukaan. DSL erottaa suodatinkontekstin ja kyselykontekstin kyselylausekkeiden osalta. Suodatinkontekstin lausekkeet testaavat asiakirjoja boolean-tyyppisesti: Vastaako asiakirja suodatinta, ”kyllä” vai ”ei”? Suodattimet ovat yleensä myös nopeampia kuin kyselyt, mutta kyselyt voivat myös laskea relevanssipistemäärän sen mukaan, kuinka hyvin asiakirja vastaa kyselyä. Suodattimet eivät käytä relevanssipistemäärää. Tämä määrittää dokumenttien järjestyksen ja sisällyttämisen:

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

Ja tuloksen:

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

Elasticsearch-klusterin luominen

Elasticsearch-klusterin ylläpito voi olla aikaa vievää, varsinkin jos teet DIY ELK:ta. Mutta kun otetaan huomioon Elasticsearchin tehokkaat haku- ja analyysiominaisuudet, tällaiset klusterit ovat välttämättömiä. Perehdymme aiheeseen syvällisemmin Elasticsearch-klusterioppaassamme, joten käytämme tätä ponnahduslautana tuolle perusteellisemmalle läpikäynnille.

Mikä on Elasticsearch-klusteri tarkalleen ottaen? Elasticsearch-klusterit ryhmittävät useita Elasticsearch-solmuja ja/tai -instansseja yhteen. Voit tietysti aina halutessasi ylläpitää yksittäistä Elasticsearch-instanssia tai -solmua tietyn klusterin sisällä. Tällaisen ryhmittelyn pääpointti on klusterin tehtävien, hakujen ja indeksoinnin jakaminen sen solmujen kesken. Solmuvaihtoehtoja ovat datasolmut, master-solmut, client-solmut ja ingest-solmut.

Solmujen asentamiseen voi liittyä paljon konfiguraatioita, jotka edellä mainittu opetusohjelmamme kattaa. Mutta tässä on Elasticsearch-klusterin solmujen perusasennus:

Asenna ensin Java:

sudo apt-get install default-jre

Sitten lisää Elasticsearchin kirjautumisavain:

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

Seuraavaksi asenna Elasticsearchin uusi iteraatio:

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

Sinun on luotava ja/tai määritettävä jokaisen Elasticsearch-solmun oma elasticsearch.yml konfiguraatiotiedosto (sudo vim /etc/elasticsearch/elasticsearch.yml). Käynnistä sieltä Elasticsearch ja tarkista sitten Elasticsearch-klusterin tila. Vastaukset näyttävät jotakuinkin tältä:

{ "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-klusterin tila on seuraavana listalla. Tarkista klusterisi terveys säännöllisesti seuraavalla API-kutsulla:

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

Tässä esimerkissä parametrina local on false, (joka on itse asiassa oletuksena). Tämä näyttää pääsolmun tilan. Jos haluat tarkistaa paikallisen solmun, vaihda tilaksi true.

Taso-parametri näyttää oletusarvoisesti klusterin kunnon, mutta sen ylittäviin riveihin kuuluvat indices ja shards (kuten yllä olevassa esimerkissä).

On lisäksi valinnaisia parametreja aikakatkaisuja varten…

timeout
master_timeout

…tai tiettyjen tapahtumien odottamista varten:

wait_for_active_shards
wait_for_events
wait_for_no_initializing_shards
wait_for_no_relocating_shards
wait_for_nodes
wait_for_status

Elasticsearch-tietojen poistaminen

Esineiden poistaminen Elasticsearchista on yhtä helppoa kuin tietojen syöttäminen Elasticsearchiin. Tällä kertaa käytettävä HTTP-metodi on-yllätys, yllätys-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}

Poistaaksesi indeksin, käytä:

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

Poistaaksesi kaikki indeksit (käytä äärimmäistä varovaisuutta noudattaen) käytä:

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

Vastauksen molemmissa tapauksissa pitäisi olla:

{ "acknowledged" : true}

Poistaaksesi yksittäisen dokumentin:

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

Mitä seuraavaksi?

Tämä opetusohjelma auttaa aloittelijoita Elasticsearchin kanssa ja tarjoaa sellaisenaan vain Elasticsearchin CRUD-operaatioiden perusvaiheet. Elasticsearch on hakukone, ja sellaisenaan sen hakuominaisuuksissa on valtavasti syvyyttä.
Viimeisimmät versiot ovat tuoneet mukanaan uskomattomia uusia Elasticsearch-ominaisuuksia ja myös joitain merkittäviä muutoksia taustalla olevaan tietorakenteeseen.

Aina kannattaa tutustua Elasticsearchin viralliseen dokumentaatioon sekä Logstash-oppaaseemme ja Kibana-oppaaseemme.

Vastaa

Sähköpostiosoitettasi ei julkaista.