Rumah  >  Artikel  >  pembangunan bahagian belakang  >  Gunakan Elasticsearch dalam bahasa Go untuk mencapai carian yang cekap

Gunakan Elasticsearch dalam bahasa Go untuk mencapai carian yang cekap

王林
王林asal
2023-06-15 21:01:402019semak imbas

Dengan kemunculan era data besar, penyimpanan dan pengambilan data telah menjadi isu penting yang kami hadapi. Elasticsearch ialah enjin carian dan analisis masa nyata teragih sumber terbuka Ia boleh mencari sejumlah besar data melalui pengindeksan terbalik yang pantas, dan menyediakan carian teks penuh, analisis agregat, pemantauan masa nyata, penyiapan automatik dan visualisasi data amalan, Ia mempunyai pelbagai aplikasi dalam senario aplikasi. Pada masa yang sama, sebagai bahasa pengaturcaraan yang pantas dan ditaip secara statik, bahasa Go juga digunakan secara meluas dalam pembangunan perkhidmatan bahagian belakang. Dalam artikel ini, kami akan memperkenalkan cara menggunakan Elasticsearch dalam bahasa Go untuk melaksanakan fungsi carian yang cekap.

1. Pasang perpustakaan Elasticsearch dan Go
Mula-mula, kita perlu memasang Elasticsearch dan perpustakaan Go yang sepadan untuk melaksanakan sokongan Go untuk klien Elasticsearch. Untuk pemasangan Elasticsearch, anda boleh pergi ke laman web rasmi Elasticsearch (https://www.elastic.co/downloads/elasticsearch) untuk memuat turun versi pakej pemasangan yang sepadan dan memasangnya mengikut sistem pengendalian dan kaedah pemasangan .

Seterusnya, kita perlu menambah perpustakaan klien Elasticsearch pada persekitaran Go. Dalam Go, terdapat banyak perpustakaan pihak ketiga yang menyokong pembangunan pengaturcaraan kami menggunakan klien Elasticsearch. Antaranya, perpustakaan yang lebih biasa ialah:

  1. Elastik (alamat dokumen: https://godoc.org/gopkg.in/olivere/elastic.v5)
  2. go-elasticsearch ( Alamat dokumen: https://github.com/elastic/go-elasticsearch)
  3. golang-elasticsearch (Alamat dokumen: https://github.com/elastic/go-elasticsearch)

Di sini kami memilih Elastik. Dalam Go, anda boleh menggunakan arahan berikut untuk memasang pustaka klien Elasticsearch:

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

2 kepada Elasticsearch Anda perlu menentukan IP dan nombor port pelayan Elasticsearch Secara lalai, nombor port Elasticsearch ialah 9200. Anda boleh menyambung melalui kaedah berikut:

klien, err := elastic.NewClient(.

elastic.SetURL("http://127.0.0.1:9200"),
elastic.SetSniff(false),

)

if err != nil {

// do something...

}

Apabila mencipta klien Elasticsearch, anda juga boleh membuat beberapa tetapan tersuai, seperti kod berikut :

klien, 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)),

)

Antaranya, untuk tetapan menyambung ke Elasticsearch, kami telah membuat konfigurasi berikut:

    SetURL() Kaedah digunakan untuk menentukan IP dan nombor port pelayan Elasticsearch kaedah
  1. SetSniff() digunakan untuk melumpuhkan Elastic daripada menemui status nod lain secara automatik; pada masa jalan untuk mendapatkan status kesihatan kluster dan maklumat lain; Kaedah SetGzip() digunakan untuk mendayakan fungsi pemampatan Gzip bagi klien Elasticsearch; tentukan maklumat segera; kaedah
  2. SetTraceLog() digunakan untuk menentukan maklumat log penjejakan.
  3. 3. Pertanyaan asas
  4. Selepas menyambung ke Elasticsearch, kami boleh melakukan pertanyaan asas pada data di dalamnya. Berikut ialah contoh pertanyaan mudah:
  5. pertanyaan := elastic.NewMatchQuery("name", "John")
  6. hasilnya, err := client.Search().
  7. Index("users").
    Query(query).
    Do(context.Background())
  8. if err != nil {
  9. // do something...
}

fmt.Printf("Query took %d milisaat
", result.TookInMillis)

Antaranya, kami menggunakan pakej anjal The Kaedah NewMatcQuery() untuk mencipta pertanyaan padanan tepat, medan pertanyaan ialah nama dan syarat pertanyaan ialah "John". Apabila melaksanakan pertanyaan, kami menetapkan indeks pertanyaan kepada pengguna dan menentukan kaedah pertanyaan Di sini kami menggunakan client.Search() untuk melaksanakan operasi pertanyaan. Akhir sekali, kami menggunakan kaedah result.TookInMillis untuk mendapatkan masa yang digunakan oleh pertanyaan.

4. Pertanyaan lanjutan

Dalam penggunaan sebenar, kita perlu melaksanakan fungsi pertanyaan yang lebih kompleks, seperti pertanyaan julat, pertanyaan kabur, pengisihan, dsb. Elasticsearch menyokong keupayaan ini melalui Query DSL (Query Domain Specific Language). Berikut ialah beberapa contoh pertanyaan biasa:


Pertanyaan teks penuh

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


Pertanyaan padanan berbilang syarat

  1. boolQuery := elastic.NewBoolQuery().Mesti(
  2. elastic.NewMatchQuery("content", "Elasticsearch"),
    elastic.NewRangeQuery("age").Gt("20"),
)

    Pertanyaan julat
rangeQuery := elastik.NewRangeQuery("umur").Gt("20").Lt("30")

Pertanyaan kabur

  1. fuzzyQuery := elastik.NewFuzzyQuery("kandungan", "Elasticsearch").
  2. Fuzziness(2).
    PrefixLength(1)
    

Isih

  1. isih := elastik.NewFieldSort("umur").Asc ( )
  2. searchResult, err := client.Search().
Index("users").
Query(boolQuery).
SortBy(sort).
Do(context.Background())

Sudah tentu, dalam penggunaan sebenar, kami akan menggunakan kaedah pertanyaan yang lebih kompleks dan fleksibel untuk mendapatkan data yang kami perlukan.

    5. Paging dan pengagregatan
  1. Apabila melakukan pertanyaan data, kami selalunya perlu memaparkan data dalam paging dan melakukan pertanyaan pengagregatan. Elasticsearch juga menyediakan kaedah pertanyaan yang menyokong operasi ini. Berikut ialah beberapa contoh pertanyaan biasa:

Pertanyaan halaman

searchResult, err := client.Search().

Index("users").
Query(boolQuery).
From(0).Size(10).
Do(context.Background())

Where, From ( ) kaedah digunakan untuk menetapkan kedudukan permulaan pertanyaan, dan kaedah Saiz() digunakan untuk menetapkan bilangan item data yang dikembalikan.

  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 之间的集成有一个更加深入的理解,应用于实际项目开发中去构建高效的搜索系统。

Atas ialah kandungan terperinci Gunakan Elasticsearch dalam bahasa Go untuk mencapai carian yang cekap. 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