Wprowadzenie do Elasticsearch

Wprowadzenie do Elasticsearch

Elasticsearch w jednym zdaniu to oprogramowanie które sprowadza się do wyszukiwania informacji, ich wizualizacji (narzędzie Kibana) a także do analizy różnego rodzaju logów. Jest to silnik wyszukiwania pełnotekstowego który wykorzystuje bibliotekę Apache Lucene. Jako, że jest to szybka obiektowa baza danych to świetnie nadaje się do realizacji tzw. read modelu zbierającego dane audytowe. Zanim przejdziemy do praktyki należy poznać kilka podstawowych pojęć:

  • Index – zbiór podobnych dokumentów np. index dla danych klientów (baza danych),
  • Type – reprezentuje klasę podobnych dokumentów (tabela),
  • Document – rekord w elastycznym formacie json, podstawowa jednostka informacji,
  • Fragment (z ang. Shards) – część indexu która stanowi odrębny sam w sobie pełnoprawny index.

Przykładowo:

localhost:9200/{index}/{type}/

i tutaj ważna uwaga:

Dokumenty nie mogą posiadać różnych typów dla tego samego pola jeśli są na tym samym indexie!

localhost:9200/customer/gold/1
{
    "description": "full description"
}

typ pola „description” to string.

localhost:9200/customer/silver/1
{
    "description": {
	short_description = ""
        long_description  = ""
     }
}

typ pola „description” to object. Oba dokumenty nie mogą być na tym samym indexie.

Dla uproszczenia pobierzmy Elasticsearch uruchamiając go na swoim lokalnym sprzęcie:

https://www.elastic.co/downloads/elasticsearch

Wykonujemy komendę:

bin\elasticsearch.bat

Aplikacja wystartowała na porcie 9200:

http://localhost:9200/
  • Dodajemy nowy dokument wysyłając żądanie POST na adres:
http://localhost:9200/javaleader/articles/1

z body:

{
  "title": "ElasticSearch",
  "category": "articles",
  "published_date": "02.11.21",
  "author": "JavaLeader"
}

wynik:

{
"_index": "javaleader",
"_type": "articles",
"_id": "1",
"_version": 1,
"result": "created",
"_shards": {
"total": 2,
"successful": 1,
"failed": 0
},
"_seq_no": 0,
"_primary_term": 1
}

w wyniku wykonania żądania POST otrzymujemy prawidłowo utworzony dokument dla indexu javaleader (index zawsze musi być pisany małą literą) o typie articles.

Wyślijmy kolejne dokumenty w ten sam sposób:

http://localhost:9200/javaleader/articles/2
{
  "title": "Spring Boot",
  "category": "articles",
  "published_date": "02.11.21",
  "author": "JavaLeader"
}
http://localhost:9200/javaleader/articles/3
{
  "title": "Angular",
  "category": "articles",
  "published_date": "02.11.21",
  "author": "JavaLeader"
}
  • Wykonajmy żądanie GET które pozwoli pobrać z Elasticsearch wszystkie nasze artykuły (dokumenty):
http://localhost:9200/javaleader/articles/_search
{
   "took":952,
   "timed_out":false,
   "_shards":{
      "total":1,
      "successful":1,
      "skipped":0,
      "failed":0
   },
   "hits":{
      "total":{
         "value":3,
         "relation":"eq"
      },
      "max_score":1,
      "hits":[
         {
            "_index":"javaleader",
            "_type":"articles",
            "_id":"1",
            "_score":1,
            "_source":{
               "title":"ElasticSearch",
               "category":"articles",
               "published_date":"02.11.21",
               "author":"JavaLeader"
            }
         },
         {
            "_index":"javaleader",
            "_type":"articles",
            "_id":"2",
            "_score":1,
            "_source":{
               "title":"Spring Boot",
               "category":"articles",
               "published_date":"02.11.21",
               "author":"JavaLeader"
            }
         },
         {
            "_index":"javaleader",
            "_type":"articles",
            "_id":"3",
            "_score":1,
            "_source":{
               "title":"Angular",
               "category":"articles",
               "published_date":"02.11.21",
               "author":"JavaLeader"
            }
         }
      ]
   }
}

Pobranie dokumentu o wskazanym identyfikatorze możemy zrealizować poprzez:

http://localhost:9200/javaleader/articles/_search?q=_id:2
  • Zaktualizujmy tytuł pierwszego artykułu wysyłając żądanie PUT:
http://localhost:9200/javaleader/articles/1

z zawartością:

{
  "title": "Elasticsearch - wprowadzenie",
  "category": "articles",
  "published_date": "02.11.21",
  "author": "JavaLeader"
}

weryfikacja żądaniem GET:

http://localhost:9200/javaleader/articles/_search?q=_id:1

wynik – dokument został prawidłowo zaktualizowany:

{
   "took":327,
   "timed_out":false,
   "_shards":{
      "total":1,
      "successful":1,
      "skipped":0,
      "failed":0
   },
   "hits":{
      "total":{
         "value":1,
         "relation":"eq"
      },
      "max_score":1,
      "hits":[
         {
            "_index":"javaleader",
            "_type":"articles",
            "_id":"1",
            "_score":1,
            "_source":{
               "title":"Elasticsearch - wprowadzenie",
               "category":"articles",
               "published_date":"02.11.21",
               "author":"JavaLeader"
            }
         }
      ]
   }
}
  • Usuńmy artykuły (dokumenty) o wskazanych identyfikatorach wykonując kolejno żądania DELETE:
http://localhost:9200/javaleader/articles/1
http://localhost:9200/javaleader/articles/2

weryfikacja – wykonująć żadanie GET otrzymamy tylko jeden artykuł:

http://localhost:9200/javaleader/articles/_search
{
   "took":898,
   "timed_out":false,
   "_shards":{
      "total":1,
      "successful":1,
      "skipped":0,
      "failed":0
   },
   "hits":{
      "total":{
         "value":1,
         "relation":"eq"
      },
      "max_score":1,
      "hits":[
         {
            "_index":"javaleader",
            "_type":"articles",
            "_id":"1",
            "_score":1,
            "_source":{
               "title":"Elasticsearch - wprowadzenie",
               "category":"articles",
               "published_date":"02.11.21",
               "author":"JavaLeader"
 
            }
         }
      ]
   }
}

Zobacz kod na GitHubie i zapisz się na bezpłatny newsletter!

.

Leave a comment

Your email address will not be published.


*