Како применити Еластицсеарцх у Го-у

Данас ћу вам показати како да примените Еластицсеарцх у Го-у.

Али наравно, пре тога ћу дати мали увод у Еластицсеарцх.

Ако сте већ стекли основно разумевање Еластицсеарцх-а, можете да пређете на следећи део.

Еластицсеарцх

Еластицсеарцх у последње време стиче велику популарност. Претраживање у релационој бази података увек има проблема са скалабилношћу и перформансама.

Еластицсеарцх је НоСКЛ база података која је била врло успешна у решавању тих проблема. Пружа велику скалабилност и перформансе, а једна од најистакнутијих карактеристика је систем бодовања који омогућава велику флексибилност у резултатима претраге. На крају крајева, то се без разлога не назива Еластиц-сеарцх!

Инсталирање Еластицсеарцх

Прво ћете морати да инсталирате Еластицсеарцх на ваш локални рачунар. Можете да одете на њихову веб локацију и потражите водич за инсталацију. У време док пишем овај чланак, користим Еластицсеарцх са бројем верзије 7.4.2.

Еластицсеарцх је унео пуно промена у своје верзије, а једна од њих је уклањање типа мапирања. Зато не очекујте да ће ово у потпуности функционисати ако користите другу верзију Еластицсеарцх-а.

По завршетку инсталације, не заборавите да покренете услугу еластичног претраживања, која је сасвим јасно наведена у њиховом водичу за инсталацију (за линук, укратко, урадите ово ./bin/elasticsearch).

Уверите се да је ваше еластично претраживање покренуто тако што ћете затражити улаз 9200 на вашој локалној машини.

ДОБИТИ localhost:9200

Ако га притиснете, требало би да видите нешто попут доле.

{ "name": "204371", "cluster_name": "elasticsearch", "cluster_uuid": "8Aa0PznuR1msDL9-PYsNQg", "version": { "number": "7.4.2", "build_flavor": "default", "build_type": "tar", "build_hash": "2f90bbf7b93631e52bafb59b3b049cb44ec25e96", "build_date": "2019-10-28T20:40:44.881551Z", "build_snapshot": false, "lucene_version": "8.2.0", "minimum_wire_compatibility_version": "6.8.0", "minimum_index_compatibility_version": "6.0.0-beta1" }, "tagline": "You Know, for Search" }

Ако се правилно приказује онда вам честитам! Успешно сте покренули услугу еластичног претраживања на вашој локалној машини. Дајте себи пљесак и попијте шољу кафе, јер је дан још увек млад.

Израда вашег првог индекса

У Еластицсеарцх-у индекс је сличан бази података. Док је раније постојала табела у еластичном претраживању под називом типе. Али пошто је тип уклоњен у тренутној верзији, сада постоје само индекси.

Збуњени сте сада? Немој бити. Укратко, само помислите да вам је потребан само индекс, а затим само требате убацити своје податке у Еластицсеарцх.

Сада ћемо направити индекс именован studentsтако што ћемо извршити упит испод.

СТАВИТИ localhost/9200/students

{ "settings": { "number_of_shards": 1, "number_of_replicas": 1 }, "mappings": { "properties": { "name": { "type": "text" }, "age": { "type": "integer" }, "average_score": { "type": "float" } } } }

Ако ништа не пође по злу, требало би да одговори узвраћајући ово.

{ "acknowledged": true, "shards_acknowledged": true } 

Ваш индекс треба да буде креиран. Сада ћемо прећи на наш следећи корак: поигравање са нашим индексом Еластицсеарцх.

Попуњавање вашег Еластицсеарцх-а

Прво, оно што ћемо сада радити је попуњавање индекса Еластицсеарцх документима. Ако вам та дефиниција није позната, само знајте да је врло слична редовима у бази података.

У НоСКЛ бази података заправо је могуће да сваки документ садржи различита поља која се не подударају са шемом.

Али немојмо то радити - конструишимо нашу колону са шемом коју смо раније дефинисали. Претходни АПИ ће вам омогућити да документ попуните у свом индексу.

ПОШТА localhost:9200/students/doc

{ "name":"Alice", "age":17, "average_score":81.1 } 

До сада би ваш Еластицсеарцх требао имати један документ. Мораћемо да убацимо још неколико података у наш Еластицсеарцх. И наравно, нећемо уметати податке о студентима један по један - то би била велика гњаважа!

Еластицсеарцх је посебно припремио АПИ за масовно слање више захтева одједном. Користимо то за уметање више података одједном.

ПОШТА /students/_bulk

{ "index":{"_index": "students" } } { "name":"john doe","age":18, "average_score":77.7 } { "index":{"_index": "students" } } { "name":"bob","age":16, "average_score":65.5 } { "index":{"_index": "students" } } { "name":"mary doe","age":18, "average_score":97.7 } { "index":{"_index": "students" } } { "name":"eve","age":15, "average_score":98.9 }

Упитајмо податке

Напокон смо населили Еластицсеарцх са још неколико података о студентима. Сада учинимо оно по чему је Еластицсеарцх познат: покушаћемо да у нашем Еластицсеарцх-у потражимо податке које смо управо убацили.

Еластицсеарцх подржава многе типове механизама за претрагу, али у овом примеру ћемо користити једноставан упит за подударање.

Почнимо нашу претрагу притиском на овај АПИ:

ПОШТА localhost:9200/_search

{ "query" : { "match" : { "name" : "doe" } } } 

Добићете повратни одговор заједно са подацима ученика који се подударају са вашим одговарајућим упитом. Сада сте званично претраживач!

{ "took": 608, "timed_out": false, "_shards": { "total": 1, "successful": 1, "skipped": 0, "failed": 0 }, "hits": { "total": { "value": 2, "relation": "eq" }, "max_score": 0.74487394, "hits": [ { "_index": "students", "_type": "_doc", "_id": "rgpef24BTFuh7kXolTpo", "_score": 0.74487394, "_source": { "name": "john doe", "age": 18, "average_score": 77.7 } }, { "_index": "students", "_type": "_doc", "_id": "sApef24BTFuh7kXolTpo", "_score": 0.74487394, "_source": { "name": "mary doe", "age": 18, "average_score": 97.7 } } ] } }

Сад кренимо!

If you have reached this part, you should have grasped the very minimum concepts of using Elasticsearch. Now, we are going to implement Elasticsearch in Go.

A very primitive way of implementing Elasticsearch is that you can keep doing http requests into your Elasticsearch IP. But we are not going to do that.

I found this very helpful library for implementing Elasticsearch in Go. You should install that library before you proceed in your Go modules.

Make your struct

First of all, you will definitely need to make a struct for your Model. In this example, we are going to use the same modeling as in our previous example which in this case is the Student struct.

package main type Student struct { Name string `json:"name"` Age int64 `json:"age"` AverageScore float64 `json:"average_score"` }

Making a Client Connection

Now, let's make a function that'll allow us to initialize our ES Client connection.

If you have a running instance of Elasticsearch outside of your localhost, you can simply change the part inside SetURL.

func GetESClient() (*elastic.Client, error) { client, err := elastic.NewClient(elastic.SetURL("//localhost:9200"), elastic.SetSniff(false), elastic.SetHealthcheck(false)) fmt.Println("ES initialized...") return client, err }

Data Insertion

After that, the first thing we can do is try to insert our data into Elasticsearch via Go. We will be making a model of Student and inserting it into our Elasticsearch client.

package main import ( "context" "encoding/json" "fmt" elastic "gopkg.in/olivere/elastic.v7" ) func main() { ctx := context.Background() esclient, err := GetESClient() if err != nil { fmt.Println("Error initializing : ", err) panic("Client fail ") } //creating student object newStudent := Student{ Name: "Gopher doe", Age: 10, AverageScore: 99.9, } dataJSON, err := json.Marshal(newStudent) js := string(dataJSON) ind, err := esclient.Index(). Index("students"). BodyJson(js). Do(ctx) if err != nil { panic(err) } fmt.Println("[Elastic][InsertProduct]Insertion Successful") }

Querying our Data

Finally, we can do some searching. The below code might look a bit complex. But rest assured, it will make more sense to you after you go through it carefully. I will be using a basic matching query in the below example.

package main import ( "context" "encoding/json" "fmt" elastic "gopkg.in/olivere/elastic.v7" ) func main() { ctx := context.Background() esclient, err := GetESClient() if err != nil { fmt.Println("Error initializing : ", err) panic("Client fail ") } var students []Student searchSource := elastic.NewSearchSource() searchSource.Query(elastic.NewMatchQuery("name", "Doe")) /* this block will basically print out the es query */ queryStr, err1 := searchSource.Source() queryJs, err2 := json.Marshal(queryStr) if err1 != nil || err2 != nil { fmt.Println("[esclient][GetResponse]err during query marshal=", err1, err2) } fmt.Println("[esclient]Final ESQuery=\n", string(queryJs)) /* until this block */ searchService := esclient.Search().Index("students").SearchSource(searchSource) searchResult, err := searchService.Do(ctx) if err != nil { fmt.Println("[ProductsES][GetPIds]Error=", err) return } for _, hit := range searchResult.Hits.Hits { var student Student err := json.Unmarshal(hit.Source, &student) if err != nil { fmt.Println("[Getting Students][Unmarshal] Err=", err) } students = append(students, student) } if err != nil { fmt.Println("Fetching student fail: ", err) } else { for _, s := range students { fmt.Printf("Student found Name: %s, Age: %d, Score: %f \n", s.Name, s.Age, s.AverageScore) } } }

The query should be printed out like this:

ES initialized... [esclient]Final ESQuery= {"query":{"match":{"name":{"query":"Doe"}}}}

And yes that query is what will be posted into the Elasticsearch.

The result of your query should also come out like this if you have followed my example since the very start:

Student found Name: john doe, Age: 18, Score: 77.700000 Student found Name: mary doe, Age: 18, Score: 97.700000 Student found Name: Gopher doe, Age: 10, Score: 99.900000 

And there you go!

То је крај мог водича о томе како применити Еластицсеарцх у Го-у. Надам се да сам обрадио основне делове коришћења Еластицсеарцх-а у Го-у.

Да бисте добили додатне информације о овој теми, требали бисте прочитати о Куери ДСЛ и бодовању функција у Еластицсеарцх-у, што је по мом мишљењу једна од најбољих ствари о Еластицсеарцх-у.

И не узнемиравајте се, библиотека коришћена у овом примеру такође подржава многе функције Еластицсеарцх-а, чак и упит за бодовање функција у Еластицсеарцх-у.

Хвала што сте прочитали мој чланак! Надам се да ће бити корисно и да ће вам помоћи да започнете коришћење Еластицсеарцх-а.

Никада немојте престати учити; знање се удвостручује сваких четрнаест месеци. ~ Антхони Ј.Д'Ангело