This commit is contained in:
2023-04-13 15:15:15 +08:00
parent f0fca2291c
commit 56c477d243
5 changed files with 122 additions and 11 deletions

View File

@@ -90,24 +90,58 @@ type ListView struct {
var mysqlConnection models.MysqlConnection
var milvusConnection models.MilvusConnection
func GetNetWorkEmbedding(id int) (embedding []float32) {
host := viper.GetString("embedding.host")
port := viper.GetInt("embedding.port")
httpClient := &http.Client{}
request, err := http.NewRequest("PUT", fmt.Sprintf("http://%s:%d/reverse/%d", host, port, id), nil)
if err != nil {
log.Println("请求失败:", err)
return
}
response, err := httpClient.Do(request)
if err != nil {
log.Println("请求失败:", err)
return
}
defer response.Body.Close()
var result map[string]interface{}
err = json.NewDecoder(response.Body).Decode(&result)
if err != nil {
log.Println("解析失败:", err)
return
}
if result["code"] != 0 {
log.Println("请求失败:", result["message"])
return
}
embedding = result["feature"].([]float32)
return embedding
}
func (image *Image) GetSimilarImagesIdList(collection_name string) (ids []int64) {
ctx := context.Background()
// 先从milvus中查询图片的向量
var embedding []float32
result, err := milvusConnection.Client.Query(ctx, collection_name, nil, fmt.Sprintf("id in [%d]", image.Id), []string{"embedding"})
if err != nil {
log.Println("Milvus query failed:", err)
return
}
var embedding []float32
for _, item := range result {
if item.Name() == "embedding" {
embedding = item.FieldData().GetVectors().GetFloatVector().Data
continue
log.Println("查詢向量失敗:", err)
embedding = GetNetWorkEmbedding(image.Id)
} else {
for _, item := range result {
if item.Name() == "embedding" {
embedding = item.FieldData().GetVectors().GetFloatVector().Data
continue
}
}
}
// TODO: 处理向量不存在的情况(生成)
// TODO: 处理图片不存在的情况(404)
// 处理向量不存在的情况
if len(embedding) == 0 {
log.Println("向量不存在, 也未能重新生成")
return ids
}
// 用向量查询相似图片
topk := 1000
@@ -115,7 +149,7 @@ func (image *Image) GetSimilarImagesIdList(collection_name string) (ids []int64)
vectors := []entity.Vector{entity.FloatVector(embedding)}
resultx, err := milvusConnection.Client.Search(ctx, collection_name, nil, "", []string{"id", "article_id"}, vectors, "embedding", entity.L2, topk, sp)
if err != nil {
log.Println("Milvus search failed:", err)
log.Println("搜索相似失敗:", err)
return
}