Rumah  >  Artikel  >  pembangunan bahagian belakang  >  Cara menggunakan Golang untuk operasi pertanyaan Elasticsearch

Cara menggunakan Golang untuk operasi pertanyaan Elasticsearch

PHPz
PHPzasal
2023-04-11 09:13:361242semak imbas

Dengan kemunculan era data besar, permintaan untuk penyimpanan data dan pertanyaan juga meningkat. Elasticsearch pada masa ini ialah enjin carian teragih yang popular dan menyediakan API RESTful yang agak mudah dan mudah digunakan. Sebagai bahasa pengaturcaraan yang cekap, Golang digemari oleh semakin ramai pembangun. Artikel ini akan memperkenalkan cara menggunakan Golang untuk melaksanakan operasi pertanyaan Elasticsearch.

1. Pemasangan perpustakaan bergantung

Di Golang, kami perlu menggunakan perpustakaan pihak ketiga untuk melaksanakan operasi berkaitan Elasticsearch. Adalah disyorkan untuk menggunakan perpustakaan github.com/elastic/go-elasticsearch yang disediakan secara rasmi.

Untuk memasang pustaka ini, jalankan sahaja arahan berikut dalam terminal:

go get github.com/elastic/go-elasticsearch

Jika komputer anda tidak dapat mengakses github.com, sila rujuk langkah berikut:

1. Lawati https://github.com/elastic/go-elasticsearch dan muat turun fail zip secara setempat.

2. Ekstrak fail zip ke direktori.

3. Alihkan direktori yang tidak dizip ke direktori GOPATH di bawah direktori projek anda.

4. Jalankan arahan berikut dalam terminal:

cd $GOPATH/go-elasticsearch
go install

Proses ini mungkin memakan masa, harap bersabar.

2. Wujudkan sambungan Elasticsearch

Untuk melakukan pertanyaan Elasticsearch, kami perlu mewujudkan sambungan terlebih dahulu. Di Golang, anda perlu memperkenalkan pustaka github.com/elastic/go-elasticsearch dahulu, dan kemudian gunakan kaedah NewDefaultClient untuk mewujudkan sambungan.

import (
    "fmt"
    "github.com/elastic/go-elasticsearch"
    "log"
)

func main() {
    cfg := elasticsearch.Config{
        Addresses: []string{
            "http://localhost:9200",
        },
    }
    es, err := elasticsearch.NewClient(cfg)
    if err != nil {
        log.Fatalf("连接 Elasticsearch 失败:%s", err)
    }
    fmt.Println("连接 Elasticsearch 成功")
}

Di sini kami nyatakan alamat Elasticsearch sebagai http://localhost:9200 Jika Elasticsearch anda dijalankan pada alamat lain, sila ubah suai alamat.

3. Data Elasticsearch Kueri

Selepas membuat sambungan, anda boleh melakukan operasi pertanyaan Elasticsearch. Kami boleh menghantar permintaan HTTP melalui pustaka http di Golang dan menerima kandungan respons untuk melengkapkan operasi pertanyaan Elasticsearch.

Ambil semua data yang test_index medannya di bawah indeks pertanyaan message mengandungi rentetan hello sebagai contoh:

import (
    "bytes"
    "encoding/json"
    "fmt"
    "github.com/elastic/go-elasticsearch"
    "github.com/elastic/go-elasticsearch/esapi"
    "io/ioutil"
    "log"
    "net/http"
    "strings"
)

func main() {
    cfg := elasticsearch.Config{
        Addresses: []string{
            "http://localhost:9200",
        },
    }
    es, err := elasticsearch.NewClient(cfg)
    if err != nil {
        log.Fatalf("连接 Elasticsearch 失败:%s", err)
    }
    fmt.Println("连接 Elasticsearch 成功")

    var (
        r map[string]interface{}
        b bytes.Buffer
    )

    query := map[string]interface{}{
        "query": map[string]interface{}{
            "match": map[string]interface{}{
                "message": "hello",
            },
        },
    }

    if err := json.NewEncoder(&b).Encode(query); err != nil {
        log.Fatalf("无法编码查询:%s", err)
    }

    req, _ := http.NewRequest("GET", "/test_index/_search", &b)
    req.Header.Add("Content-Type", "application/json")

    res, err := es.Perform(req)
    if err != nil {
        log.Fatalf("查询 Elasticsearch 失败:%s", err)
    }

    defer res.Body.Close()

    if res.IsError() {
        var r map[string]interface{}
        if err := json.NewDecoder(res.Body).Decode(&r); err != nil {
            log.Fatalf("响应错误:%s", err)
        } else {
            // 响应错误信息
            log.Fatalf("响应错误:%s", r["error"].(map[string]interface{})["reason"])
        }
    }

    if err := json.NewDecoder(res.Body).Decode(&r); err != nil {
        log.Fatalf("响应结果解析失败:%s", err)
    }

    results := r["hits"].(map[string]interface{})["hits"].([]interface{})
    fmt.Printf("共找到 %d 条匹配结果:\n", len(results))
    for _, result := range results {
        message := result.(map[string]interface{})["_source"].(map[string]interface{})["message"].(string)
        fmt.Printf("%s\n", message)
    }
}

Di sini kita mentakrifkan syarat pertanyaan, iaitu, message Medan mengandungi hello rentetan. Kemudian gunakan pustaka http Golang untuk membuat permintaan HTTP dan meletakkan syarat pertanyaan dalam badan permintaan. Kemudian gunakan kaedah es.Perform untuk menghantar permintaan dan menerima respons.

Jika hasil respons tidak betul, kami boleh mendapatkan maklumat ralat dengan menghuraikan data JSON. Jika tiada ralat dalam jawapan, kami mencetak hasil pertanyaan dalam terminal.

Perlu diingatkan bahawa di sini kami menggunakan kaedah GET untuk menghantar permintaan pertanyaan. Malah, Elasticsearch menyokong banyak kaedah permintaan pertanyaan yang berbeza, termasuk GET, POST, PUT, dsb. Untuk kaedah dan sintaks pertanyaan khusus, sila rujuk dokumentasi rasmi Elasticsearch.

Kaedah yang diperkenalkan dalam artikel ini adalah berdasarkan API RESTful Elasticsearch. Selain itu, Elasticsearch juga menyediakan kaedah pertanyaan yang lebih fleksibel dan cekap, menggunakan perpustakaan Golang yang disediakan secara rasmi github.com/olivere/elastic. Jika anda mempunyai keperluan pertanyaan yang lebih cekap, pertimbangkan untuk menggunakan perpustakaan ini.

Ringkasnya, sangat mudah dan pantas untuk menggunakan Elasticsearch untuk pertanyaan di Golang. Hanya beberapa baris kod diperlukan untuk melaksanakan fungsi pertanyaan data yang berkuasa. Adalah disyorkan bahawa pembangun memberi lebih perhatian kepada teknologi berkaitan Elasticsearch dan meningkatkan keupayaan penyimpanan data dan pertanyaan mereka.

Atas ialah kandungan terperinci Cara menggunakan Golang untuk operasi pertanyaan Elasticsearch. Untuk maklumat lanjut, sila ikut artikel berkaitan lain di laman web China PHP!

Kenyataan:
Kandungan artikel ini disumbangkan secara sukarela oleh netizen, dan hak cipta adalah milik pengarang asal. Laman web ini tidak memikul tanggungjawab undang-undang yang sepadan. Jika anda menemui sebarang kandungan yang disyaki plagiarisme atau pelanggaran, sila hubungi admin@php.cn