백엔드 개발 Golang 효율적인 검색을 위해 Go 언어에서 Elasticsearch를 사용하세요.

효율적인 검색을 위해 Go 언어에서 Elasticsearch를 사용하세요.

Jun 15, 2023 pm 09:01 PM
언어로 가다 elasticsearch 찾다

빅데이터 시대가 도래하면서 데이터의 저장과 검색은 우리가 직면한 중요한 문제가 되었습니다. Elasticsearch는 오픈소스 분산 실시간 검색 및 분석 엔진으로, 빠른 역인덱싱을 통해 대용량 데이터 검색이 가능하며, 효율적인 전체 텍스트 검색, 집계 분석, 실시간 모니터링, 자동 완성, 데이터 시각화 기능을 제공합니다. 실제로 응용 시나리오에는 광범위한 응용 프로그램이 있습니다. 동시에 Go 언어는 빠르고 정적인 유형의 프로그래밍 언어로서 백엔드 서비스 개발에도 널리 사용됩니다. 이번 글에서는 효율적인 검색 기능을 구현하기 위해 Go 언어에서 Elasticsearch를 활용하는 방법을 소개하겠습니다.

1. Elasticsearch 및 Go 라이브러리 설치
먼저 Elasticsearch 클라이언트에 대한 Go 지원을 구현하려면 Elasticsearch 및 해당 Go 라이브러리를 설치해야 합니다. Elasticsearch 설치를 위해서는 Elasticsearch 공식 홈페이지(https://www.elastic.co/downloads/elasticsearch)에 접속하여 해당 버전의 설치 패키지를 다운로드한 후 운영체제 및 설치 방법에 따라 설치하시면 됩니다. .

다음으로 Elasticsearch 클라이언트 라이브러리를 Go 환경에 추가해야 합니다. Go에는 Elasticsearch 클라이언트를 사용한 프로그래밍 개발을 지원하는 많은 타사 라이브러리가 있습니다. 그중 가장 일반적인 라이브러리는 다음과 같습니다.

  1. Elastic(문서 주소: https://godoc.org/gopkg.in/olivere/elastic.v5)
  2. go-elasticsearch(문서 주소: https://github. com /elastic/go-elasticsearch)
  3. golang-elasticsearch (문서 주소: https://github.com/elastic/go-elasticsearch)

여기에서는 Elastic을 선택합니다. Go에서는 다음 명령을 사용하여 Elasticsearch 클라이언트 라이브러리를 설치할 수 있습니다.

go get -u gopkg.in/olivere/elastic.v5

2. Elasticsearch에 연결
Elasticsearch에 연결하려면 IP를 지정해야 합니다. Elasticsearch 서버의 포트 번호는 기본적으로 Elasticsearch의 포트 번호는 9200입니다. 다음 방법을 통해 연결할 수 있습니다:

client, err := elastic.NewClient(

elastic.SetURL("http://127.0.0.1:9200"),
elastic.SetSniff(false),
로그인 후 복사

)
if err != nil {

// do something...
로그인 후 복사
로그인 후 복사

}

Elasticsearch 클라이언트 생성 터미널 중에 다음 코드와 같은 일부 사용자 정의 설정을 할 수도 있습니다:

client, err := elastic.NewClient(

elastic.SetURL("http://127.0.0.1:9200"),
elastic.SetSniff(false),
elastic.SetHealthcheck(true),
elastic.SetGzip(true),
elastic.SetErrorLog(log.New(os.Stderr, "ELASTIC ", log.LstdFlags)),
elastic.SetInfoLog(log.New(os.Stdout, "", log.LstdFlags)),
elastic.SetTraceLog(log.New(ioutil.Discard, "", 0)),
로그인 후 복사

)

그 중 설정에 대한 내용은 다음과 같습니다. Elasticsearch에 연결하기 위해 다음과 같이 구성했습니다.

  1. SetURL() 메서드는 Elasticsearch 서버의 IP 및 포트 번호를 지정하는 데 사용됩니다.
  2. SetSniff() 메서드는 Elastic이 자동으로 검색하는 것을 방지하는 데 사용됩니다. 클러스터 상태 및 기타 정보를 얻기 위해 런타임 시 다른 노드의 상태,
  3. SetHealthcheck() 메소드를 사용하여 상태 감지 빈도를 지정하기 위해 이상이 감지되면 알림이 전송됩니다. Elasticsearch 클라이언트의 Gzip 압축 기능을 활성화하는 데 사용됩니다.
  4. SetErrorLog() 메서드는 오류 로그 정보를 지정하는 데 사용됩니다.
  5. SetTraceLog() 메서드는 오류 로그 정보를 지정하는 데 사용됩니다. 추적 로그 정보.
  6. 3. 기본 쿼리
  7. Elasticsearch에 연결한 후 데이터에 대한 기본 쿼리를 수행할 수 있습니다. 다음은 간단한 쿼리 예입니다.
query := elastic.NewMatchQuery("name", "John")

result, err := client.Search().

Index("users").
Query(query).
Do(context.Background())
로그인 후 복사

if err != nil {

// do something...
로그인 후 복사
로그인 후 복사

}

fmt.Printf("Query take %d milliseconds

", result.TookInMillis)

그 중 Elastic 패키지의 NewMatcQuery() 메서드를 사용하여 정확히 일치하는 쿼리를 생성합니다. 쿼리 필드는 이름이고 쿼리 조건은 다음과 같습니다. "존". 쿼리를 실행할 때 쿼리 인덱스를 사용자로 설정하고 쿼리 메서드를 지정했습니다. 여기서는 쿼리 작업을 수행하기 위해 client.Search()를 사용합니다. 마지막으로 result.TookInMillis 메서드를 사용하여 쿼리에 소요된 시간을 가져옵니다.

4. 고급 쿼리

실제 사용에서는 범위 쿼리, 퍼지 쿼리, 정렬 등 더 복잡한 쿼리 기능을 구현해야 합니다. Elasticsearch는 Query DSL(Query DomainSpecific Language)을 통해 이러한 기능을 지원합니다. 다음은 일반적인 쿼리 방법의 몇 가지 예입니다.

전체 텍스트 쿼리

    query := elastic.NewMatchQuery("content", "Elasticsearch")
다중 조건 일치 쿼리

    boolQuery := elastic.NewBoolQuery () .Must(
  1. elastic.NewMatchQuery("content", "Elasticsearch"),
    elastic.NewRangeQuery("age").Gt("20"),
    로그인 후 복사
  2. )

범위 쿼리

    rangeQuery := elastic.NewRangeQuery("age").Gt("20").Lt("30")
퍼지 쿼리

    fuzzyQuery : = elastic.NewFuzzyQuery("content", "Elasticsearch").
  1. Fuzziness(2).
    PrefixLength(1)
    
    로그인 후 복사
sort

    sort := elastic.NewFieldSort("age").Asc()
  1. searchResult, err := client.Search() .
  2. Index("users").
    Query(boolQuery).
    SortBy(sort).
    Do(context.Background())
    
    로그인 후 복사
물론 실제 사용에서는 필요한 데이터를 얻기 위해 더 복잡하고 유연한 쿼리 방법을 사용하게 됩니다.


5. 페이징 및 집계

​​데이터 쿼리를 수행할 때 데이터를 페이지에 표시하고 집계 쿼리를 수행해야 하는 경우가 많습니다. Elasticsearch는 이러한 작업을 지원하는 쿼리 방법도 제공합니다. 다음은 몇 가지 일반적인 쿼리 예입니다.

Page query

    searchResult, err := client.Search().
  1. Index("users").
    Query(boolQuery).
    From(0).Size(10).
    Do(context.Background())
    
    로그인 후 복사
  2. 이 중 From() 메서드를 사용하여 쿼리 시작 위치를 설정하고 크기를 설정합니다. () 메소드를 사용하여 반환되는 데이터 항목 수를 설정하는 데 사용됩니다.
  1. 聚合查询

ageAggs := elastic.NewTermsAggregation().Field("age")
searchResult, err := client.Search().

Index("users").
Query(boolQuery).
Aggregation("age_group", ageAggs).
Do(context.Background())
로그인 후 복사

其中,我们使用了 Elastic 中的 NewTermsAggregation() 方法和 Aggregation() 方法来创建聚合查询。在这个示例中,我们以 "age" 字段作为聚合查询的依据。

六、总结
在本文中,我们介绍了如何在 Go 语言中使用 Elasticsearch 构建一个高效的搜索系统。从连接 Elasticsearch 开始,我们讲解了基础查询、进阶查询、分页和聚合查询等多种查询方式,以及如何使用 Elasticsearch 去提高我们的搜索效率,并给出了部分示例代码。通过阅读本文,您应该可以对 Go 和 Elasticsearch 之间的集成有一个更加深入的理解,应用于实际项目开发中去构建高效的搜索系统。

위 내용은 효율적인 검색을 위해 Go 언어에서 Elasticsearch를 사용하세요.의 상세 내용입니다. 자세한 내용은 PHP 중국어 웹사이트의 기타 관련 기사를 참조하세요!

본 웹사이트의 성명
본 글의 내용은 네티즌들의 자발적인 기여로 작성되었으며, 저작권은 원저작자에게 있습니다. 본 사이트는 이에 상응하는 법적 책임을 지지 않습니다. 표절이나 침해가 의심되는 콘텐츠를 발견한 경우 admin@php.cn으로 문의하세요.

핫 AI 도구

Undresser.AI Undress

Undresser.AI Undress

사실적인 누드 사진을 만들기 위한 AI 기반 앱

AI Clothes Remover

AI Clothes Remover

사진에서 옷을 제거하는 온라인 AI 도구입니다.

Undress AI Tool

Undress AI Tool

무료로 이미지를 벗다

Clothoff.io

Clothoff.io

AI 옷 제거제

AI Hentai Generator

AI Hentai Generator

AI Hentai를 무료로 생성하십시오.

인기 기사

R.E.P.O. 에너지 결정과 그들이하는 일 (노란색 크리스탈)
1 몇 달 전 By 尊渡假赌尊渡假赌尊渡假赌
R.E.P.O. 최고의 그래픽 설정
1 몇 달 전 By 尊渡假赌尊渡假赌尊渡假赌
Will R.E.P.O. 크로스 플레이가 있습니까?
1 몇 달 전 By 尊渡假赌尊渡假赌尊渡假赌

뜨거운 도구

메모장++7.3.1

메모장++7.3.1

사용하기 쉬운 무료 코드 편집기

SublimeText3 중국어 버전

SublimeText3 중국어 버전

중국어 버전, 사용하기 매우 쉽습니다.

스튜디오 13.0.1 보내기

스튜디오 13.0.1 보내기

강력한 PHP 통합 개발 환경

드림위버 CS6

드림위버 CS6

시각적 웹 개발 도구

SublimeText3 Mac 버전

SublimeText3 Mac 버전

신 수준의 코드 편집 소프트웨어(SublimeText3)

Go 's Crawler Colly의 큐 스레드의 문제는 무엇입니까? Go 's Crawler Colly의 큐 스레드의 문제는 무엇입니까? Apr 02, 2025 pm 02:09 PM

Go Crawler Colly의 대기열 스레딩 문제는 Colly Crawler 라이브러리를 GO 언어로 사용하는 문제를 탐구합니다. � ...

GO에서 플로팅 포인트 번호 작업에 어떤 라이브러리가 사용됩니까? GO에서 플로팅 포인트 번호 작업에 어떤 라이브러리가 사용됩니까? Apr 02, 2025 pm 02:06 PM

Go Language의 부동 소수점 번호 작동에 사용되는 라이브러리는 정확도를 보장하는 방법을 소개합니다.

이동 중에 왜 println 및 string () 함수로 문자열이 다른 효과를 갖는 이유는 무엇입니까? 이동 중에 왜 println 및 string () 함수로 문자열이 다른 효과를 갖는 이유는 무엇입니까? Apr 02, 2025 pm 02:03 PM

Go Language의 문자열 인쇄의 차이 : println 및 String () 함수 사용 효과의 차이가 진행 중입니다 ...

Redis Stream을 사용하여 GO Language에서 메시지 대기열을 구현할 때 User_ID 유형 변환 문제를 해결하는 방법은 무엇입니까? Redis Stream을 사용하여 GO Language에서 메시지 대기열을 구현할 때 User_ID 유형 변환 문제를 해결하는 방법은 무엇입니까? Apr 02, 2025 pm 04:54 PM

Go Language에서 메시지 대기열을 구현하기 위해 Redisstream을 사용하는 문제는 Go Language와 Redis를 사용하는 것입니다 ...

골란드의 사용자 정의 구조 레이블이 표시되지 않으면 어떻게해야합니까? 골란드의 사용자 정의 구조 레이블이 표시되지 않으면 어떻게해야합니까? Apr 02, 2025 pm 05:09 PM

골란드의 사용자 정의 구조 레이블이 표시되지 않으면 어떻게해야합니까? Go Language 개발을 위해 Goland를 사용할 때 많은 개발자가 사용자 정의 구조 태그를 만날 것입니다 ...

GO의 어떤 라이브러리가 대기업에서 개발하거나 잘 알려진 오픈 소스 프로젝트에서 제공합니까? GO의 어떤 라이브러리가 대기업에서 개발하거나 잘 알려진 오픈 소스 프로젝트에서 제공합니까? Apr 02, 2025 pm 04:12 PM

GO의 어떤 라이브러리가 대기업이나 잘 알려진 오픈 소스 프로젝트에서 개발 했습니까? GO에 프로그래밍 할 때 개발자는 종종 몇 가지 일반적인 요구를 만납니다.

GO 언어에서 'var'와 'type` 키워드 정의 구조의 차이점은 무엇입니까? GO 언어에서 'var'와 'type` 키워드 정의 구조의 차이점은 무엇입니까? Apr 02, 2025 pm 12:57 PM

GO 언어에서 구조를 정의하는 두 가지 방법 : VAR과 유형 키워드의 차이. 구조를 정의 할 때 Go Language는 종종 두 가지 다른 글쓰기 방법을 본다 : 첫째 ...

sql.open을 사용할 때 DSN이 비어있을 때 오류가 발생하지 않습니까? sql.open을 사용할 때 DSN이 비어있을 때 오류가 발생하지 않습니까? Apr 02, 2025 pm 12:54 PM

sql.open을 사용할 때 DSN에 오류가 발생하지 않는 이유는 무엇입니까? Go Language, SQL.open ...

See all articles