Sådan implementeres Elasticsearch i Go

I dag skal jeg vise dig, hvordan du implementerer Elasticsearch i Go.

Men selvfølgelig vil jeg før det give en lille introduktion til Elasticsearch.

Hvis du allerede har fået en grundlæggende forståelse af Elasticsearch, kan du springe til næste del.

Elastiksøgning

Elasticsearch har vundet meget popularitet på det seneste. Søgning i en relationsdatabase har altid problemer omkring skalerbarhed og ydeevne.

Elasticsearch er en NoSQL-database, der har haft stor succes med at tackle disse problemer. Det giver stor skalerbarhed og ydeevne, og en af ​​de mest fremtrædende funktioner er scoringssystemet, der giver stor fleksibilitet i søgeresultaterne. Når alt kommer til alt kaldes det ikke elastisk søgning uden grund!

Installation af Elasticsearch

Først skal du installere Elasticsearch på din lokale maskine. Du kan gå til deres websted og få installationsvejledningen til det. På det tidspunkt, hvor jeg skrev denne artikel, bruger jeg Elasticsearch med version nummer 7.4.2.

Elasticsearch har foretaget mange ændringer i deres versioner, hvoraf den ene er fjernelsen af ​​kortlægningstypen. Så forvent ikke, at dette fungerer fuldt ud, hvis du bruger en anden version af Elasticsearch.

Når du er færdig med din installation, skal du ikke glemme at køre din elasticsearch-service, som er nævnt ganske tydeligt i deres installationsvejledning (for linux skal du kort sagt gøre dette ./bin/elasticsearch).

Sørg for, at din elastiksøgning kører ved at anmode om port 9200 på din lokale maskine.

localhost:9200

At ramme det skal vise noget som nedenfor.

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

Hvis det viser korrekt så tillykke! Du har kørt din elasticsearch-service med succes på din lokale maskine. Giv dig selv et klapp og tag en kop kaffe, da dagen stadig er ung.

At lave dit første indeks

I Elasticsearch svarer indeks til en database. Mens der tidligere var bord i elastiksøgning kaldet type. Men da typen er fjernet i den nuværende version, er der kun indeks nu.

Forvirret nu? Vær ikke. I en nøddeskal, bare tænk at du kun har brug for indeks, så bagefter skal du bare indsætte dine data i Elasticsearch.

Nu skal vi lave et indeks navngivet studentsved at udføre forespørgslen nedenfor.

SÆTTE localhost/9200/students

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

Hvis intet går galt, skal det reagere igen ved at give dette.

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

Dit indeks skal oprettes. Nu fortsætter vi til vores næste trin: at lege med vores Elasticsearch-indeks.

Udfyld din elastiksøgning

For det første skal vi udfylde vores Elasticsearch-indeks med dokumenter. Hvis du ikke er bekendt med denne definition, skal du bare vide, at den ligner meget på rækker i en database.

I en NoSQL-database er det faktisk muligt for hvert dokument at indeholde forskellige felter, der ikke stemmer overens med skemaet.

Men lad os ikke gøre det - lad os konstruere vores kolonne med et skema, som vi tidligere har defineret. Den forrige API giver dig mulighed for at udfylde dokumentet i dit indeks.

STOLPE localhost:9200/students/doc

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

Din Elasticsearch skal have ét dokument nu. Vi bliver nødt til at indsætte flere flere data i vores Elasticsearch. Og selvfølgelig vil vi ikke indsætte vores studenterdata en efter en - det ville være et besvær!

Elasticsearch har specifikt udarbejdet en bulk-API for at sende flere anmodninger på én gang. Lad os bruge det til at indsætte flere data på én gang.

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

Lad os spørge efter dataene

Vi har endelig udfyldt vores Elasticsearch med flere flere studerendes data. Lad os nu gøre, hvad Elasticsearch er kendt for: vi vil forsøge at søge i vores Elasticsearch efter de data, vi lige har indsat.

Elasticsearch understøtter mange typer søgemekanismer, men i dette eksempel bruger vi en simpel matchende forespørgsel.

Lad os starte vores søgning ved at trykke på denne API:

STOLPE localhost:9200/_search

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

Du vil få dit svar tilbage sammen med de studerendes data, der matchede din tilsvarende forespørgsel. Nu er du officielt en søgemaskine!

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

Lad os nu komme til Go!

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!

Det er slutningen af ​​min vejledning om, hvordan du implementerer Elasticsearch i Go. Jeg håber, jeg har dækket de meget grundlæggende dele af brugen af ​​Elasticsearch i Go.

For at få yderligere information om dette emne, skal du læse om Query DSL og Function Scoring i Elasticsearch, som efter min mening er en af ​​de bedste ting ved Elasticsearch.

Og sørg ikke for det, biblioteket, der bruges i dette eksempel, understøtter også mange Elasticsearch-funktioner, selv Function Scoring-forespørgslen i Elasticsearch.

Tak for at læse igennem min artikel! Jeg håber, det vil være nyttigt og kan hjælpe dig med at komme i gang med at bruge Elasticsearch.

Stop aldrig med at lære; viden fordobles hver fjorten måned. ~ Anthony J.D'Angelo