Az Elasticsearch megvalósítása a Go-ban

Ma megmutatom, hogyan lehet megvalósítani az Elasticsearch-et a Go-ban.

De természetesen előtte egy kis bevezetőt adok az Elasticsearch-hez.

Ha már elsajátította az Elasticsearch alapvető ismereteit, ugorhat a következő részre.

Elasticsearch

Az elasticsearch az utóbbi időben nagy népszerűségnek örvend. A Relációs adatbázisban történő keresésnek mindig vannak problémái a méretezhetőség és a teljesítmény körül.

Az Elasticsearch egy NoSQL adatbázis, amely nagyon sikeresen kezelte ezeket a kérdéseket. Nagyszerű skálázhatóságot és teljesítményt nyújt, és az egyik legkiemelkedőbb tulajdonság a pontozási rendszer, amely nagy rugalmasságot biztosít a keresési eredmények között. Végül is ezt nem hívják Elastic-search ok nélkül!

Az Elasticsearch telepítése

Először telepítenie kell az Elasticsearch alkalmazást a helyi gépére. Látogasson el a weboldalukra, és szerezze be a telepítési útmutatót hozzá. A cikk írásakor az Elasticsearch-t használom a 7.4.2 verziószámmal.

Az Elasticsearch sok változást hajtott végre verzióikban, az egyik a leképezési típus eltávolítása. Tehát ne számítson arra, hogy ez teljes mértékben működik, ha az Elasticsearch másik verzióját használja.

A telepítés befejezése után ne felejtsd el futtatni az elasticsearch szolgáltatást, amelyet elég egyértelműen megemlítenek a telepítési útmutatóban (röviden ezt a linux esetében tedd ./bin/elasticsearch).

Győződjön meg róla, hogy az elasztikus keresés fut , kérve a helyi gép 9200-as portját.

KAP localhost:9200

Ha eltalálja, akkor valami hasonlót kell mutatnia.

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

Ha jól mutat, akkor gratulálunk! Sikeresen futtatta a rugalmas gépen a rugalmas gépet. Adj magadnak egy tapsot, és igyál egy csésze kávét, mivel a nap még fiatal.

Az első index elkészítése

Az Elasticsearchben az index hasonló az adatbázishoz. Míg korábban az elasztikus kutatásban volt egy táblázatnak nevezett táblázat. De mivel a jelenlegi verzióban eltávolították a típust, most csak indexek vannak.

Most összezavarodott? Ne legyél. Dióhéjban gondolja csak úgy, hogy csak indexre van szüksége, majd utána csak be kell illesztenie adatait az Elasticsearchbe.

Most egy indexet fogunk készíteni az studentsalábbi lekérdezés végrehajtásával.

PUT localhost/9200/students

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

Ha semmi baj nem történik, akkor vissza kell adnia ezt.

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

Az indexet létre kell hozni. Most folytatjuk a következő lépéssel: játszani az Elasticsearch indexünkkel.

Az Elasticsearch kitöltése

Először is, amit most fogunk tenni, az az, hogy kitöltsük az Elasticsearch indexünket dokumentumokkal. Ha még nem ismeri ezt a meghatározást, csak tudja, hogy nagyon hasonlít az adatbázis soraihoz.

A NoSQL adatbázisban valójában minden dokumentum különböző mezőket tartalmazhat, amelyek nem felelnek meg a sémának.

De ne tegyük ezt - állítsuk össze oszlopunkat egy korábban definiált sémával. Az előző API lehetővé teszi, hogy kitöltse a dokumentumot az indexében.

POST localhost:9200/students/doc

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

Az Elasticsearch-nek már egy dokumentummal kell rendelkeznie. Még több adatot kell beszúrnunk az Elasticsearch-be. És természetesen nem fogjuk egyesével beilleszteni a hallgatói adatainkat - ez elég gond lenne!

Az Elasticsearch kifejezetten egy tömeges API-t készített elő annak érdekében, hogy egyszerre több kérést küldjön. Használjuk ezt egyszerre több adat beszúrásához.

POST /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 }

Lekérdezzük az adatokat

Végül feltöltöttük az Elasticsearch-t több további hallgató adataival. Most tegyük meg azt, amiről az Elasticsearch ismert: megpróbáljuk megkeresni az Elasticsearch-ben az imént beillesztett adatokat.

Az Elasticsearch sokféle keresési mechanizmust támogat, de ebben a példában egy egyszerű egyező lekérdezést fogunk használni.

Kezdjük a keresést az API megütésével:

POST localhost:9200/_search

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

Vissza fogja kapni válaszát, valamint a hallgatók adatait, amelyek egyeztek a megfelelő lekérdezéssel. Most hivatalosan keresőmérnök vagy!

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

Most térjünk a Go-ra!

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!

Ezzel vége az oktatóanyagomnak az Elasticsearch megvalósításáról a Go alkalmazásban. Remélem, hogy áttekintettem az Elasticsearch in Go használatának alapvető elemeit.

Ha további információt szeretne kapni erről a témáról, olvassa el a Query DSL és a Function Scoring elemeket az Elasticsearchben, amelyek véleményem szerint az egyik legjobb dolog az Elasticsearch-tel kapcsolatban.

És ne aggódjon, az ebben a példában használt könyvtár sok Elasticsearch funkciót is támogat, még az Elasticsearch Function Scoring lekérdezését is.

Köszönöm, hogy végigolvastad a cikkemet! Remélem, hogy hasznos lesz, és segíthet az Elasticsearch használatának megkezdésében.

Soha ne hagyd abba a tanulást; tizennégy havonta megduplázódik a tudás. ~ Anthony J.D'Angelo