ホームページ バックエンド開発 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 の公式 Web サイト (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 に接続します
Connect Elasticsearch へ Elasticsearch サーバーの IP とポート番号を指定する必要があります。デフォルトでは、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() メソッドは健全性ステータスの検出頻度を指定するために使用され、異常が検出された場合は通知が送信されます;
  4. SetGzip () メソッドは Elasticsearch クライアントの Gzip 圧縮機能を有効にするために使用されます;
  5. SetErrorLog() メソッドはエラー ログ情報を指定するために使用されます;
  6. SetInfoLog() メソッドはエラー ログ情報を指定するために使用されますプロンプト情報。
  7. SetTraceLog() メソッドは、追跡ログ情報を指定するために使用されます。

3. 基本的なクエリ
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 は %d ミリ秒かかりました
", result.TookInMillis)

その中で、elastic パッケージを使用しましたNewMatcQuery() メソッドは完全一致クエリを作成します。クエリ フィールドは名前、クエリ条件は「John」です。クエリを実行する際には、クエリ インデックスを users に設定し、クエリ メソッドを指定します。ここでは client.Search() を使用してクエリ操作を実行します。最後に、result.TookInMillis メソッドを使用して、クエリに費やされた時間を取得します。

4. 高度なクエリ
実際の使用では、範囲クエリ、ファジー クエリ、並べ替えなど、より複雑なクエリ関数を実装する必要があります。 Elasticsearch は、Query DSL (Query Domain Specific Language) を通じてこれらの機能をサポートします。一般的なクエリの例を次に示します。

  1. フルテキスト クエリ

query := elastic.NewMatchQuery("content", "Elasticsearch")

  1. 複数条件一致クエリ

boolQuery := elastic.NewBool​​Query().Must(

elastic.NewMatchQuery("content", "Elasticsearch"),
elastic.NewRangeQuery("age").Gt("20"),
ログイン後にコピー

)

  1. 範囲クエリ

rangeQuery := elastic.NewRangeQuery("age").Gt("20").Lt("30")

  1. ファジー クエリ

fuzzyQuery := elastic.NewFuzzyQuery("content", "Elasticsearch").

Fuzziness(2).
PrefixLength(1)
ログイン後にコピー
  1. sort

sort := elastic.NewFieldSort("age").Asc ( )
searchResult, err := client.Search().

Index("users").
Query(boolQuery).
SortBy(sort).
Do(context.Background())
ログイン後にコピー

もちろん、実際の使用では、より複雑で柔軟なクエリ メソッドを使用して、必要なデータを取得します。

5. ページングと集計
データ クエリを実行するとき、多くの場合、データをページに表示し、集計クエリを実行する必要があります。 Elasticsearch は、こ​​れらの操作をサポートするクエリ メソッドも提供します。一般的なクエリの例を次に示します。

  1. Page query

searchResult, err := client.Search().

Index("users").
Query(boolQuery).
From(0).Size(10).
Do(context.Background())
ログイン後にコピー

その中で、From () メソッドはクエリの開始位置を設定するために使用され、Size() メソッドは返されるデータ項目の数を設定するために使用されます。

  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 中国語 Web サイトの他の関連記事を参照してください。

このウェブサイトの声明
この記事の内容はネチズンが自主的に寄稿したものであり、著作権は原著者に帰属します。このサイトは、それに相当する法的責任を負いません。盗作または侵害の疑いのあるコンテンツを見つけた場合は、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ヘンタイを無料で生成します。

ホットツール

メモ帳++7.3.1

メモ帳++7.3.1

使いやすく無料のコードエディター

SublimeText3 中国語版

SublimeText3 中国語版

中国語版、とても使いやすい

ゼンドスタジオ 13.0.1

ゼンドスタジオ 13.0.1

強力な PHP 統合開発環境

ドリームウィーバー CS6

ドリームウィーバー CS6

ビジュアル Web 開発ツール

SublimeText3 Mac版

SublimeText3 Mac版

神レベルのコード編集ソフト(SublimeText3)

GOの浮動小数点番号操作に使用されるライブラリは何ですか? GOの浮動小数点番号操作に使用されるライブラリは何ですか? Apr 02, 2025 pm 02:06 PM

GO言語の浮動小数点数操作に使用されるライブラリは、精度を確保する方法を紹介します...

Go's Crawler Collyのキュースレッドの問題は何ですか? Go's Crawler Collyのキュースレッドの問題は何ですか? Apr 02, 2025 pm 02:09 PM

Go Crawler Collyのキュースレッドの問題は、Go言語でColly Crawler Libraryを使用する問題を調査します。 �...

GOのどのライブラリが大企業によって開発されていますか、それとも有名なオープンソースプロジェクトによって提供されていますか? GOのどのライブラリが大企業によって開発されていますか、それとも有名なオープンソースプロジェクトによって提供されていますか? Apr 02, 2025 pm 04:12 PM

大企業または有名なオープンソースプロジェクトによって開発されたGOのどのライブラリが開発されていますか? GOでプログラミングするとき、開発者はしばしばいくつかの一般的なニーズに遭遇します...

GO言語の「VAR」と「タイプ」キーワード定義構造の違いは何ですか? GO言語の「VAR」と「タイプ」キーワード定義構造の違いは何ですか? Apr 02, 2025 pm 12:57 PM

GO言語で構造を定義する2つの方法:VARとタイプのキーワードの違い。構造を定義するとき、GO言語はしばしば2つの異なる執筆方法を見ます:最初...

Redisストリームを使用してGO言語でメッセージキューを実装する場合、user_idタイプの変換の問題を解決する方法は? Redisストリームを使用してGO言語でメッセージキューを実装する場合、user_idタイプの変換の問題を解決する方法は? Apr 02, 2025 pm 04:54 PM

redisstreamを使用してGo言語でメッセージキューを実装する問題は、GO言語とRedisを使用することです...

Goでは、Printlnとstring()関数を備えた文字列を印刷すると、なぜ異なる効果があるのですか? Goでは、Printlnとstring()関数を備えた文字列を印刷すると、なぜ異なる効果があるのですか? Apr 02, 2025 pm 02:03 PM

Go言語での文字列印刷の違い:printlnとstring()関数を使用する効果の違いはGOにあります...

GoおよびViperライブラリを使用するときにポインターを渡す必要があるのはなぜですか? GoおよびViperライブラリを使用するときにポインターを渡す必要があるのはなぜですか? Apr 02, 2025 pm 04:00 PM

ポインター構文とviperライブラリの使用における問題への取り組みGO言語でプログラミングするとき、特にポインターの構文と使用を理解することが重要です...

GO言語の範囲を使用してマップを通過してマップを保存するのに、なぜすべての値が最後の要素になるのですか? GO言語の範囲を使用してマップを通過してマップを保存するのに、なぜすべての値が最後の要素になるのですか? Apr 02, 2025 pm 04:09 PM

GOのマップイテレーションにより、すべての値が最後の要素になるのはなぜですか? Go言語では、いくつかのインタビューの質問に直面したとき、あなたはしばしば地図に遭遇します...

See all articles