## Návod na prácu s Elasticsearch 
###  Inštalácia 

ES je dostupný na všetky operačné systémy ako Windows, MacOs aj Linux. Pre
prácu bol zvolený operačný systém Linux, ktorý je vhodnejší ako Windows. V systéme sme vytvorili adresár, ktorý bude obsahovať všetky potrebné súčasti. Do tohto
adresára sme si stiahli ES, ktorý stačilo rozbaliť a je pripravený na použitie aj bez
inštalácie. Pre spustením je potrebné mať prostredie Java Runtime Environment vo
verzii aspoň 1.8


Na tejto stránke najdeme najnosvsiu verziu ES
[Návod na instalaciu ES - oficialna stranka](https://www.elastic.co/guide/en/elasticsearch/reference/current/deb.html)

**Zopár prikazov na lepsie fungovanie ES**

sudo -i service elasticsearch start   //start ES
sudo -i service elasticsearch stop    //stop ES

**Ak chceme aby sa ES spustal automaticky po spusteni OS**

sudo /bin/systemctl daemon-reload
sudo /bin/systemctl enable elasticsearch.service

**potom vieme ES spustat takto**

sudo systemctl start elasticsearch.service

sudo systemctl stop elasticsearch.service

**alebo zistime v akom stave sa nachadza**

sudo service elasticsearch status



### Podpora slovenčiny

Pre použitie Hunspell token filtru, stačí jeho obsah stiahnuť z webovej stránky a
rozbaliť ho. Po rozbalení obsahu je potrebné otvoriť adresár kde máme nainštalovaný
ES. Konkrétne v adresári config vytvoríme nový adresár s názvom hunspell, v ňom
ďalej vytvoríme adresár sk_SK. Do tohto adresára nakopírujeme súbory, ktoré sme
získali rozbalením Hunspellu. Výsledná súborová štruktúru si môžeme pozrieť na
obrázku :

![Súborová štruktúra Hunspell](suborova_struktura.PNG)

Pre správne fungovanie už potrebujeme len nastaviť analyzér správne. Dôležité
je poradie v akom sa filtre budú aplikovať na text. Na obrázku si môžeme pozrieť
kompletné nastavenie analyzéru(pozn. ES musí byť spustený). Ak je všetko správne
ES nám odpovie hláškou "true". Ako definovať analyzér si môžeme pozrieť na obrázku :

![Definícia analýzeru](def_analyzeru.PNG)

### Mapping

Po nastavení analyzéra potrebujeme ešte pred samotným indexovaním dát nastaviť mapping. Je dôležité nastaviť to na začiatku, kedže mapping už potom nie je
možné upraviť. Bolo by potrebné zmazať celý index a nastaviť mapping znova. Pri
mappingu potrebujeme vedieť, že každý článok bude obsahovať svoje jedinečné ID,
názov(title) a telo(body) článku. Týmto poliam musíme definovať štruktúru, čiže ID
bude typu integer, polia title a body budú typu text.

### Indexovanie dát

Na indexovanie použijeme pripravený zdrojový kód s názvom elasticsearch.js. Na
spustenie javascript kód potrebujeme mať nainštalovaný program Nodejs, najlepšie
v čo najnovšej verzii. Kód spustíme pomocou príkazového riadka zadaním príkazu:
nodejs elasticsearch.js.
Zdrojový kód načítava súbor, v ktorom sú všetky novinové články vo formáte
JSON, kde jeden riadok je jeden JSON, čiže jeden novinový článok. Načítavanie
prebieha po riadkoch, kde každému riadku je priradený index postupne v rozsahu 1
až 4781. každý článok obsahuje jedinečné ID, názov a telo.
Po spustení kódu sa nám zobrazí hláška, ktorá nás informuje o počte indexovaných článkov a vytvorí index s názvom "skweb", kde sa indexuje 4781 novinových
článkov, ktorým budú priradené ID. Po úspešnom indexovaní môžeme začať dáta
vyhľadávať. Ukážka správneho indexovania je na obrázku :

![Ukážka indexovania](ukazka_indexovania.PNG)

### Vyhľadávanie

Po úspešnom indexovaní môžeme začať s vyhľadávaním. Musíme si pripraviť dotaz
pre ES. Obrázok znázorňuje komunikáciu s ES a vyhľadávanie pomocou neho.
Odpoveď ES si môžeme pozrieť na obrázku. Sú tam zobrazené informácie
o trvaní vyhľadávania v ms, počte nájdených dokumentov, indexe, v ktorom sa
nachádza nájdený dokument, type, v ktorom je uložený dokument a ID dokumentu.

![Vyhľadávanie](vyhladavanie.PNG)

![Odpoveď]( odpoved.PNG)


### Výpočet presnosti

Použijeme metódu precision-recall. V priečinku ../scnc21 sa nachádza súbor answers,
ktorý obsahuje ID všetkých relevantných článkov pre každú otázku. Pri vyhľadávaní
majú články ID v rozsahu 1-4871. V súbore answers majú články ID dokumentov
označené inými číslami. Preto je potrebné každému ID z nášho vyhľadávača priradiť ID zo súboru answers aby sme správne vedeli vypočítať presnosť. Keďže naše indexovanie článkov prebiehalo načítavaním po riadkoch tak ID dokumentu, ktorý
nám našiel vyhľadávač je vlastne číslo riadku, pomocou ktorého sme indexovali dáta.
Stačí si pozrieť súbor info.txt , pomocou ktorého vieme prideliť správne ID.
Potom nám stačí použiť nástroj na výpočet precision-recall, môžeme to byť npm
balíček precision-recall alebo online kalkulátor. Ak vypočítame presnosť pre každú
otázku na záver stačí vypočítať aritmetický priemer všetkých otázok.


**Všetky potrebné zdrojové súbory su priložené v tomto repozitári**

**Môžu nastať menšie rozdiely kvôli novším verziám použitých nástrojov napr. ES, Nodejs**

**Užitočné odkazy** :

Dáta na indexovanie k stiahnutiu, články zo slovenského internetu:

https://nlp.web.tuke.sk/static/files/scnc1.zip

Súbory potrebné na výpočet presnosti, konkrétne otázky a a súbor správnych odpovedí:

https://nlp.web.tuke.sk/static/files/scnc21.zip

Všetko doležité ohľadom ES je na ich oficiálnej stránke :
 https://www.elastic.co/elasticsearch/
 
Dôležité veci ohľadom Nodejs nájdete tu :
 https://nodejs.org/en/blog/
 
 Pre viac informácií stači pozrieť bakalársku prácu :
https://opac.crzp.sk/?fn=detailBiblioForm&sid=A4CA3C451D400D4BD034603141D1&seo=CRZP-detail-kniha