From 04e1456eaa6bc07fb5030363c386e414e7970634 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=E8=A7=89?= Date: Thu, 7 Dec 2023 01:06:02 +0800 Subject: [PATCH] =?UTF-8?q?=E6=9B=B4=E6=8D=A2=E6=90=9C=E7=B4=A2=E5=BC=95?= =?UTF-8?q?=E6=93=8E=E5=B9=B6=E9=98=B2=E6=AD=A2milvus=E4=BD=BF=E7=94=A8?= =?UTF-8?q?=E7=B3=BB=E7=BB=9F=E4=BB=A3=E7=90=86?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- api/graphql.go | 22 +++++- go.mod | 4 +- models/milvus.go | 2 + models/zincsearch.go | 166 +++++++++++++++++++++++++++++++++++++++++++ 4 files changed, 191 insertions(+), 3 deletions(-) create mode 100644 models/zincsearch.go diff --git a/api/graphql.go b/api/graphql.go index 565259f..dda52d8 100644 --- a/api/graphql.go +++ b/api/graphql.go @@ -267,7 +267,27 @@ func NewSchema(config Config) (graphql.Schema, error) { var id_list []string if args.Text != "" { fmt.Println("args:", args) - id_list = models.ElasticsearchSearch(args.Text).GetIDList(args.First, args.Last, args.After, args.Before) + //id_list = models.ElasticsearchSearch(args.Text).GetIDList(args.First, args.Last, args.After, args.Before) + resp, err := models.ZincSearch(map[string]interface{}{ + "query": map[string]interface{}{ + "bool": map[string]interface{}{ + "must": []map[string]interface{}{ + { + "query_string": map[string]string{"query": "content:" + args.Text}, + }, + }, + }, + }, + "sort": []string{}, + "from": 0, + "size": 10, + }) + if err != nil { + fmt.Println("获取图像列表失败", err) + return nil, err + } + id_list = resp.ToIDList(args.First, args.Last, args.After, args.Before) + id_list_str := strings.Trim(strings.Join(strings.Fields(fmt.Sprint(id_list)), ","), "[]") if id_list_str == "" { return map[string]interface{}{ diff --git a/go.mod b/go.mod index b9d04fb..b192eb3 100644 --- a/go.mod +++ b/go.mod @@ -9,8 +9,10 @@ require ( github.com/disintegration/imaging v1.6.2 github.com/elastic/go-elasticsearch/v8 v8.11.0 github.com/graphql-go/graphql v0.8.1 + github.com/graphql-go/handler v0.2.3 github.com/jmoiron/sqlx v1.3.5 github.com/milvus-io/milvus-sdk-go/v2 v2.2.1 + github.com/mitchellh/mapstructure v1.5.0 github.com/spf13/viper v1.15.0 github.com/stretchr/testify v1.8.1 ) @@ -28,13 +30,11 @@ require ( github.com/elastic/elastic-transport-go/v8 v8.3.0 // indirect github.com/fsnotify/fsnotify v1.6.0 // indirect github.com/golang/protobuf v1.5.2 // indirect - github.com/graphql-go/handler v0.2.3 // indirect github.com/grpc-ecosystem/go-grpc-middleware v1.3.0 // indirect github.com/hashicorp/hcl v1.0.0 // indirect github.com/json-iterator/go v1.1.12 // indirect github.com/magiconair/properties v1.8.7 // indirect github.com/milvus-io/milvus-proto/go-api v0.0.0-20230301092744-7efc6eec15fd // indirect - github.com/mitchellh/mapstructure v1.5.0 // indirect github.com/modern-go/concurrent v0.0.0-20180306012644-bacd9c7ef1dd // indirect github.com/modern-go/reflect2 v1.0.2 // indirect github.com/pelletier/go-toml/v2 v2.0.6 // indirect diff --git a/models/milvus.go b/models/milvus.go index 11802b0..2620a37 100644 --- a/models/milvus.go +++ b/models/milvus.go @@ -4,6 +4,7 @@ import ( "context" "fmt" "log" + "os" "github.com/milvus-io/milvus-sdk-go/v2/client" ) @@ -18,6 +19,7 @@ func (m *MilvusConnection) GetClient() client.Client { func (m *MilvusConnection) Init() (err error) { log.Println("Milvus connection init") + os.Setenv("NO_PROXY", config.GetString("milvus.host")) m.Client, err = client.NewGrpcClient(context.Background(), fmt.Sprintf( "%s:%d", config.GetString("milvus.host"), diff --git a/models/zincsearch.go b/models/zincsearch.go new file mode 100644 index 0000000..9f3cf57 --- /dev/null +++ b/models/zincsearch.go @@ -0,0 +1,166 @@ +package models + +import ( + "bytes" + "encoding/base64" + "encoding/json" + "fmt" + "io" + "net/http" +) + +// 查询参数 +//type Query struct { +// Query struct { +// Bool struct { +// Must []struct { +// QueryString struct { +// Query string `json:"query"` +// } `json:"query_string"` +// } `json:"must"` +// } `json:"bool"` +// } `json:"query"` +// Sort []string `json:"sort"` +// From int `json:"from"` +// Size int `json:"size"` +//} + +// 返回结果 +type Response struct { + Took int `json:"took"` + TimedOut bool `json:"timed_out"` + Shards struct { + Total int `json:"total"` + Successful int `json:"successful"` + Skipped int `json:"skipped"` + Failed int `json:"failed"` + } `json:"_shards"` + Hits struct { + Total struct { + Value int `json:"value"` + } `json:"total"` + MaxScore float64 `json:"max_score"` + Hits []struct { + Index string `json:"_index"` + Type string `json:"_type"` + ID string `json:"_id"` + Score float64 `json:"_score"` + Timestamp string `json:"@timestamp"` + Source struct { + Timestamp string `json:"@timestamp"` + Athlete string `json:"Athlete"` + City string `json:"City"` + Country string `json:"Country"` + Discipline string `json:"Discipline"` + Event string `json:"Event"` + Gender string `json:"Gender"` + Medal string `json:"Medal"` + Season string `json:"Season"` + Sport string `json:"Sport"` + Year int `json:"Year"` + } `json:"_source"` + } `json:"hits"` + } `json:"hits"` +} + +func (res Response) ToIDList(first, last, after, before int) (id_list []string) { + for _, hit := range res.Hits.Hits { + id_list = append(id_list, hit.ID) + } + + // 如果 after 不为 0, 从这个ID开始向后取切片 + if after != 0 { + after_str := fmt.Sprint(after) + for i, id := range id_list { + if id == after_str { + id_list = id_list[i+1:] + break + } + } + } + + // 如果 before 不为 0, 从这个ID开始向前取切片 + if before != 0 { + before_str := fmt.Sprint(before) + for i, id := range id_list { + if id == before_str { + id_list = id_list[:i] + break + } + } + } + + // 如果 first 不为 0, 取切片的前 first 个元素 + if first != 0 { + if first > len(id_list) { + first = len(id_list) + } + id_list = id_list[:first] + } + + // 如果 last 不为 0, 取切片的后 last 个元素 + if last != 0 { + if last > len(id_list) { + last = len(id_list) + } + id_list = id_list[len(id_list)-last:] + } + + return +} + +func ZincSearch(query map[string]interface{}) (rest Response, err error) { + const ( + user = "admin" + password = "Complexpass#123" + index = "olympics" + zincHost = "https://zincsearch.gameui.net" + ) + bas64encodedCreds := base64.StdEncoding.EncodeToString([]byte(user + ":" + password)) + zincURL := zincHost + "/es/" + index + "/_search" + queryBytes, _ := json.Marshal(query) + req, err := http.NewRequest("POST", zincURL, bytes.NewBuffer(queryBytes)) + if err != nil { + return + } + req.Header.Set("Content-type", "application/json") + req.Header.Set("Authorization", "Basic "+bas64encodedCreds) + + resp, err := http.DefaultClient.Do(req) + if err != nil { + return + } + defer resp.Body.Close() + err = json.NewDecoder(resp.Body).Decode(&rest) + return +} + +func ZincPut(data map[string]interface{}) (err error) { + const ( + user = "admin" + password = "Complexpass#123" + index = "olympics" + zincHost = "https://zincsearch.gameui.net" + ) + bas64encodedCreds := base64.StdEncoding.EncodeToString([]byte(user + ":" + password)) + zincURL := zincHost + "/api/" + index + "/_doc" + queryBytes, _ := json.Marshal(data) + req, err := http.NewRequest("POST", zincURL, bytes.NewBuffer(queryBytes)) + if err != nil { + return + } + req.Header.Set("Content-type", "application/json") + req.Header.Set("Authorization", "Basic "+bas64encodedCreds) + resp, err := http.DefaultClient.Do(req) + if err != nil { + return + } + defer resp.Body.Close() + // 直接作为文本打印 body + bodyBytes, err := io.ReadAll(resp.Body) + if err != nil { + return + } + fmt.Println(string(bodyBytes)) + return +}