Rumah  >  Artikel  >  pembangunan bahagian belakang  >  Melaksanakan enjin carian teragih menggunakan go-zero

Melaksanakan enjin carian teragih menggunakan go-zero

WBOY
WBOYasal
2023-06-22 17:59:181358semak imbas

Dengan kemunculan era Internet, peranan enjin carian menjadi semakin penting. Sebagai salah satu alat yang paling biasa digunakan untuk pengguna Internet, enjin carian bukan sahaja memberikan kami kaedah mendapatkan semula yang mudah, tetapi juga menyediakan sokongan untuk menapis dan mengklasifikasikan maklumat rangkaian. Walau bagaimanapun, untuk pemprosesan volum data berskala besar dan lawatan pengguna, seni bina enjin carian tradisional tidak lagi dapat memenuhi keperluan.

Seni bina enjin carian yang diedarkan dengan berkesan boleh menyelesaikan masalah kesesakan dalam seni bina tradisional Dengan memperuntukkan tugas yang berbeza kepada nod yang berbeza untuk pelaksanaan, ia boleh menggunakan sepenuhnya sumber pengkomputeran gugusan dan meningkatkan kelajuan tindak balas dan kestabilan. sistem tersebut. Dalam teknologi seni bina yang diedarkan semasa, rangka kerja go-zero adalah pilihan yang sangat baik.

go-zero ialah rangka kerja mikro perkhidmatan sumber terbuka ringan yang dibangunkan berdasarkan Golang. Ia menyediakan set lengkap rantai alat, termasuk penjanaan kod, pengesahan parameter, penghalaan, pengelogan, pengendalian ralat, caching, pengehadan semasa dan fungsi lain, yang sangat memudahkan pembangunan dan penyelenggaraan perkhidmatan mikro. Dalam pembinaan enjin carian teragih, rangka kerja go-zero boleh membantu kami melaksanakan sistem berprestasi tinggi dan ketersediaan tinggi dengan cepat.

Di bawah, kami akan menggunakan contoh untuk memperkenalkan cara menggunakan go-zero untuk membina enjin carian teragih.

Langkah 1: Bina persekitaran

Mula-mula, kita perlu memasang rangka kerja Golang dan go-zero. Selepas pemasangan, gunakan baris arahan alat yang disediakan oleh go-zero untuk menjana templat projek. Masukkan:

goctl api new search

dalam baris arahan untuk menjana projek baharu. Berdasarkan ini, kita boleh mula membangun.

Langkah 2: Tetapkan konfigurasi

Apabila membangunkan enjin carian teragih, langkah yang paling penting ialah menentukan konfigurasi sistem yang diedarkan. Kami perlu mencipta fail konfigurasi bernama search-api.yaml dalam direktori akar projek dan mentakrifkan maklumat konfigurasi berikut di dalamnya:

Name: search # 服务名
Description: "搜索服务" # 服务描述
Version: 1.0.0 # 服务版本

Host: 127.0.0.1 # 服务绑定IP地址
Port: 8888 # 服务绑定端口号

Redis:
  Host: 127.0.0.1 # Redis服务地址
  Port: 6379 # Redis服务端口号
  Password: "" # Redis密码

Etcd:
  Hosts:
    - 127.0.0.1:2379 # Etcd集群地址

Dalam fail konfigurasi, kami mentakrifkan nama perkhidmatan, perihalan, versi, The alamat mengikat perkhidmatan dan nombor port juga termasuk maklumat konfigurasi Redis dan Etcd. Antaranya, Redis digunakan untuk cache hasil carian, dan Etcd digunakan untuk melaksanakan pendaftaran perkhidmatan dan penemuan.

Langkah 3: Tentukan antara muka API

Seterusnya, kita perlu mentakrifkan antara muka API enjin carian. Dalam carian/api/search.api, takrifkan yang berikut:

syntax = "proto3";

package search.api;

option go_package = "search/api/search";

message Request {
    string keyword = 1;
    int32 page = 2;
    int32 size = 3;
}

message Response {
    repeated Result result = 1;
}

message Result {
    string title = 1;
    string url = 2;
    string abstract = 3;
}

service Search {
    rpc Query(Request) returns (Response);
}

Dalam API carian, kami mentakrifkan permintaan Permintaan dan parameter respons Respons, serta struktur hasil carian Hasil. API carian termasuk antara muka Pertanyaan, yang menerima kata kunci carian pengguna, maklumat halaman dan parameter lain serta mengembalikan hasil carian.

Langkah 4: Laksanakan logik perniagaan

Selepas antara muka API ditakrifkan, kita boleh mula menulis kod logik perniagaan. Dalam search/internal/search/search.go, pemprosesan permintaan carian dan caching hasil carian dilaksanakan. Lihat ulasan untuk butiran pelaksanaan kod tertentu:

package search

import (
    "context"
    "encoding/json"

    "github.com/Yesterday17/go-search-engine/global"
    "github.com/Yesterday17/go-search-engine/internal/search/model"
    "github.com/Yesterday17/go-search-engine/internal/search/service"
    "github.com/Yesterday17/go-zero/core/stores/redis"
    "github.com/Yesterday17/go-zero/rest/httpx"
)

type Search struct {
    redis      *redis.Redis
    searchFunc func(string, int32, int32) ([]model.Result, error)
}

func NewSearch(redis *redis.Redis) *Search {
    return &Search{
        redis: redis,
        searchFunc: service.Search.implement,
    }
}

func (s *Search) Query(ctx context.Context, req *model.Request) (*model.Response, error) {
    resp := &model.Response{}
    key := generateKey(req.Keyword, req.Page, req.Size)

    // 搜索结果缓存
    result, err := s.redis.Get(key).Result()
    if err == nil {
        if err := json.Unmarshal([]byte(result), resp); err != nil {
            return nil, err
        }
        return resp, nil
    }

    result, err = s.searchFunc(req.Keyword, req.Page, req.Size)
    if err != nil {
        return nil, err
    }

    // 将搜索结果序列化为json,存储至redis
    data, err := json.Marshal(result)
    if err != nil {
        return nil, err
    }

    if err := s.redis.Set(key, string(data), global.SearchResultExpire).Err(); err != nil {
        return nil, err
    }

    resp.Result = result
    return resp, nil
}

func generateKey(keyword string, page, size int32) string {
    return "search_" + keyword + "_" + httpx.ConvertIntToString(int(page)) + "_" +
        httpx.ConvertIntToString(int(size))
}

Dalam kod, kami melaksanakan kaedah Pertanyaan untuk menerima permintaan pengguna dan mendapatkan semula hasil carian daripada Redis. Jika hasil carian wujud dalam Redis, hasil cache dikembalikan secara langsung jika ia tidak wujud, kaedah service.Search.implement dipanggil untuk melakukan carian dan hasil carian disirikan ke dalam json dan dicache dalam Redis.

Langkah 5: Mulakan perkhidmatan

Langkah terakhir ialah memulakan perkhidmatan carian. Kami menjalankan arahan berikut pada baris arahan dalam direktori carian:

go run search.go -f api/search.api -s svc.yaml -c search-api.yaml

Selepas perkhidmatan berjaya dimulakan, kami boleh menguji pelaksanaan fungsi carian dengan mengakses antara muka localhost:8888/search/query.

Ringkasan

Artikel ini memperkenalkan cara menggunakan rangka kerja go-zero untuk membina enjin carian teragih dengan cepat. Dalam pembangunan sistem teragih, fleksibiliti dan kecekapan rangka kerja go-zero telah diiktiraf secara meluas, dan ia telah digunakan secara meluas dalam perkhidmatan mikro dan senario perniagaan konkurensi tinggi. Saya harap artikel ini dapat membantu pembaca yang ingin menguasai teknologi pembangunan sistem teragih.

Atas ialah kandungan terperinci Melaksanakan enjin carian teragih menggunakan go-zero. 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