Maison  >  Article  >  développement back-end  >  Comment utiliser Golang pour les opérations de requête Elasticsearch

Comment utiliser Golang pour les opérations de requête Elasticsearch

PHPz
PHPzoriginal
2023-04-11 09:13:361179parcourir

Avec l'avènement de l'ère du Big Data, les exigences en matière de stockage et de requêtes de données augmentent également. Elasticsearch est actuellement un moteur de recherche distribué populaire et fournit une API RESTful relativement simple et facile à utiliser. En tant que langage de programmation efficace, Golang est apprécié par de plus en plus de développeurs. Cet article explique comment utiliser Golang pour effectuer des opérations de requête Elasticsearch.

1. Installation de la bibliothèque dépendante

Dans Golang, nous devons utiliser une bibliothèque tierce pour effectuer les opérations liées à Elasticsearch. Il est recommandé d'utiliser la bibliothèque github.com/elastic/go-elasticsearch officiellement fournie. github.com/elastic/go-elasticsearch 库。

要安装这个库,只需要在终端中运行以下命令即可:

go get github.com/elastic/go-elasticsearch

如果你的电脑无法访问 github.com,请参考以下步骤:

1.访问 https://github.com/elastic/go-elasticsearch ,下载 zip 文件到本地。

2.将 zip 文件解压到某个目录下。

3.将解压后的目录移动至您的工程目录下的 GOPATH 目录。

4.在终端运行以下命令:

cd $GOPATH/go-elasticsearch
go install

这个过程可能比较耗时,请耐心等待。

二、建立 Elasticsearch 连接

要进行 Elasticsearch 查询,我们需要先建立连接。在 Golang 中,首先需要引入 github.com/elastic/go-elasticsearch 库,然后使用 NewDefaultClient 方法即可建立连接。

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 成功")
}

这里我们指定 Elasticsearch 的地址为 http://localhost:9200,如果您的 Elasticsearch 运行在其他地址上,请修改该地址即可。

三、查询 Elasticsearch 数据

建立连接后,就可以进行 Elasticsearch 的查询操作了。我们可以通过 Golang 中的 http 库发送 HTTP 请求,并接收响应内容,即可完成 Elasticsearch 的查询操作。

以查询索引 test_indexmessage 字段包含 hello 字符串的所有数据为例:

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)
    }
}

这里我们首先定义了一个查询条件,即 message 字段包含 hello 字符串。然后使用 Golang 的 http 库创建了一个 HTTP 请求,并将该查询条件放在了请求体中。接着使用 es.Perform 方法发送请求,并接收响应结果。

如果响应结果出错,我们可以通过解析 JSON 数据,得到错误信息。如果响应结果没有出错,我们将查询结果打印在终端中。

需要注意的是,这里我们使用了 GET 方法发送了一个查询请求。实际上,Elasticsearch 支持多种不同的查询请求方式,包括 GETPOSTPUT 等。具体查询方式和语法,请参考 Elasticsearch 官方文档。

本文介绍的方法基于 Elasticsearch 的 RESTful API。除此之外,Elasticsearch 还提供了一种更加灵活高效的查询方式,即使用其官方提供的 Golang 库 github.com/olivere/elastic

Pour installer cette bibliothèque, exécutez simplement la commande suivante dans le terminal :

rrreee

Si votre ordinateur ne peut pas accéder à github.com, veuillez vous référer aux étapes suivantes : 🎜🎜1. Visitez . https://github.com/elastic/go-elasticsearch, téléchargez le fichier zip en local. 🎜🎜2. Décompressez le fichier zip dans un répertoire. 🎜🎜3. Déplacez le répertoire décompressé vers le répertoire GOPATH sous le répertoire de votre projet. 🎜🎜4. Exécutez la commande suivante dans le terminal : 🎜rrreee🎜Ce processus peut prendre du temps, veuillez être patient. 🎜🎜2. Établir une connexion Elasticsearch🎜🎜Pour effectuer des requêtes Elasticsearch, nous devons d'abord établir une connexion. Dans Golang, vous devez d'abord introduire la bibliothèque github.com/elastic/go-elasticsearch, puis utiliser la méthode NewDefaultClient pour établir une connexion. 🎜rrreee🎜Ici, nous spécifions l'adresse d'Elasticsearch comme http://localhost:9200 Si votre Elasticsearch s'exécute sur une autre adresse, veuillez modifier l'adresse. 🎜🎜3. Interroger les données Elasticsearch🎜🎜Après avoir établi la connexion, vous pouvez effectuer des opérations de requête Elasticsearch. Nous pouvons envoyer des requêtes HTTP via la bibliothèque http dans Golang et recevoir le contenu de la réponse pour terminer l'opération de requête Elasticsearch. 🎜🎜Prenons comme exemple toutes les données dont le champ message sous l'index de requête test_index contient la chaîne hello : 🎜rrreee🎜Ici, nous définissons d'abord une requête La condition est que le champ message contienne la chaîne hello. Utilisez ensuite la bibliothèque http de Golang pour créer une requête HTTP et placer les conditions de requête dans le corps de la requête. Utilisez ensuite la méthode es.Perform pour envoyer la requête et recevoir la réponse. 🎜🎜Si le résultat de la réponse est erroné, nous pouvons obtenir les informations d'erreur en analysant les données JSON. S'il n'y a aucune erreur dans la réponse, nous imprimons les résultats de la requête dans le terminal. 🎜🎜Il est à noter que nous utilisons ici la méthode GET pour envoyer une requête de requête. En fait, Elasticsearch prend en charge diverses méthodes de requête de requête, notamment GET, POST, PUT, etc. Pour connaître les méthodes de requête et la syntaxe spécifiques, veuillez vous référer à la documentation officielle d'Elasticsearch. 🎜🎜La méthode présentée dans cet article est basée sur l'API RESTful d'Elasticsearch. De plus, Elasticsearch fournit également une méthode de requête plus flexible et plus efficace, en utilisant sa bibliothèque Golang officiellement fournie github.com/olivere/elastic. Si vous avez des exigences de requête plus efficaces, envisagez d'utiliser cette bibliothèque. 🎜🎜En bref, il est très pratique et rapide d'utiliser Elasticsearch pour des requêtes dans Golang. Seules quelques lignes de code sont nécessaires pour implémenter de puissantes fonctions de requête de données. Il est recommandé aux développeurs d'accorder plus d'attention aux technologies liées à Elasticsearch et d'améliorer leurs capacités de stockage de données et de requête. 🎜

Ce qui précède est le contenu détaillé de. pour plus d'informations, suivez d'autres articles connexes sur le site Web de PHP en chinois!

Déclaration:
Le contenu de cet article est volontairement contribué par les internautes et les droits d'auteur appartiennent à l'auteur original. Ce site n'assume aucune responsabilité légale correspondante. Si vous trouvez un contenu suspecté de plagiat ou de contrefaçon, veuillez contacter admin@php.cn