go
Go Elasticsearch 예제
까오기
2024. 7. 18. 15:12
Go에서 Elasticsearch에 요청을 보내고 결과를 받기 위해 공식 Elasticsearch Go 클라이언트를 사용할 수 있습니다. 여기서는 Elasticsearch v7 용 Go 클라이언트를 사용하는 예제를 제공합니다.
Directory 생성
mkdir elasticsearch
cd ./elasticsearch
프로젝트 초기화
go mod init elasticsearch
Elasticsearch Go 클라이언트 설치
먼저 Elasticsearch Go 클라이언트를 설치합니다. go get 명령어를 사용합니다:
go get github.com/elastic/go-elasticsearch/v7
Elasticsearch 클라이언트를 사용하여 문서 인덱싱 및 검색 예제
다음은 Elasticsearch에 문서를 인덱싱하고 검색하는 간단한 Go 프로그램입니다.
package main
import (
"bytes"
"context"
"encoding/json"
"fmt"
"log"
"strings"
"github.com/elastic/go-elasticsearch/v7"
"github.com/elastic/go-elasticsearch/v7/esapi"
)
// Document 구조체 정의
type Document struct {
Title string `json:"title"`
Content string `json:"content"`
}
func main() {
// Elasticsearch 클라이언트 설정
cfg := elasticsearch.Config{
Addresses: []string{
"http://external-elasticsearch:9200", // 외부 Elasticsearch 클러스터의 주소
},
}
es, err := elasticsearch.NewClient(cfg)
if err != nil {
log.Fatalf("Error creating the client: %s", err)
}
// 인덱스 할 문서 정의
doc := Document{
Title: "Hello, Elasticsearch!",
Content: "This is a simple document.",
}
// 문서를 JSON으로 변환
docJSON, err := json.Marshal(doc)
if err != nil {
log.Fatalf("Error marshaling the document: %s", err)
}
// 문서 인덱싱
req := esapi.IndexRequest{
Index: "test_es_documents",
DocumentID: "1",
Body: bytes.NewReader(docJSON),
Refresh: "true",
}
res, err := req.Do(context.Background(), es)
if err != nil {
log.Fatalf("Error getting response: %s", err)
}
defer res.Body.Close()
if res.IsError() {
log.Fatalf("Error indexing document ID=%s", req.DocumentID)
} else {
fmt.Printf("Indexed document ID=%s\n", req.DocumentID)
}
// 문서 검색
var buf bytes.Buffer
query := map[string]interface{}{
"query": map[string]interface{}{
"match": map[string]interface{}{
"title": "elasticsearch",
},
},
}
if err := json.NewEncoder(&buf).Encode(query); err != nil {
log.Fatalf("Error encoding query: %s", err)
}
searchReq := esapi.SearchRequest{
Index: []string{"test_es_documents"},
Body: strings.NewReader(buf.String()),
}
searchRes, err := searchReq.Do(context.Background(), es)
if err != nil {
log.Fatalf("Error getting response: %s", err)
}
defer searchRes.Body.Close()
if searchRes.IsError() {
log.Fatalf("Error searching test_es_documents")
} else {
var result map[string]interface{}
if err := json.NewDecoder(searchRes.Body).Decode(&result); err != nil {
log.Fatalf("Error parsing the response body: %s", err)
}
// 검색 결과 출력
fmt.Printf("Search result: %+v\n", result)
}
}
결과
Indexed document ID=1
Search result: map[_shards:map[failed:0 skipped:0 successful:1 total:1] hits:map[hits:[map[_id:1 _index:test_es_documents _score:0.2876821 _source:map[content:This is a simple document. title:Hello, Elasticsearch!] _type:_doc]] max_score:0.2876821 total:map[relation:eq value:1]] timed_out:false took:0]
설명
- Elasticsearch 클라이언트 설정: elasticsearch.NewDefaultClient() 함수를 사용하여 기본 설정으로 Elasticsearch 클라이언트를 만듭니다.
- 문서 정의: Document 구조체를 정의하고 인덱싱할 문서를 만듭니다.
- 문서 인덱싱:
- docJSON 변수에 문서를 JSON으로 변환합니다.
- esapi.IndexRequest 구조체를 사용하여 문서 인덱싱 요청을 만듭니다.
- req.Do 메서드를 호출하여 인덱싱 요청을 수행하고 응답을 처리합니다.
- 문서 검색:
- query 변수에 검색 쿼리를 정의합니다.
- esapi.SearchRequest 구조체를 사용하여 검색 요청을 만듭니다.
- searchReq.Do 메서드를 호출하여 검색 요청을 수행하고 응답을 처리합니다.
이 예제는 Elasticsearch에 문서를 인덱싱하고, 그 문서를 검색하는 과정을 보여줍니다. 이를 통해 Elasticsearch Go 클라이언트를 사용하여 데이터를 인덱싱하고 검색하는 방법을 이해할 수 있습니다.
출처 : chatGPT