栏目分类:
子分类:
返回
名师互学网用户登录
快速导航关闭
当前搜索
当前分类
子分类
实用工具
热门搜索
名师互学网 > IT > 软件开发 > 后端开发 > Go语言

Go es中使用脚本操作

Go语言 更新时间: 发布时间: IT归档 最新发布 模块sitemap 名妆网 法律咨询 聚返吧 英语巴士网 伯小乐 网商动力

Go es中使用脚本操作

摘要:官方库:使用go向es进行数据操作脚本 - 紫色飞猪 - 博客园

摘要:排序查询:golang-ElasticSearch学习 - 简书

摘要:go-elasticSearch实战篇(二) - 知乎

摘要:完美起航-ES7(三):用GO搜索elasticsearch数据

go中使用es的script语法,并通过返回自定义_score和其他字段排序

func (s *Search) esSearch(excludeIds []string, Keys string, lastScores int64, lastUpdateTime int64, limit int) (arr []*RecommendEs, err error) {
	

	//fmt.Println("lastScores: ", lastScores)
	//fmt.Printf("lastUpdateTime: %f", float64(lastUpdateTime))
	//fmt.Println("limit: ", limit)
	inline := "def v=0; if(_score>50){v=25+doc['like_number'].value+doc['share_comment_number'].value}else if(_score > 40){v=15+doc['like_number'].value+doc['share_comment_number'].value}else if(_score>30){v=10+doc['like_number'].value+doc['share_comment_number'].value}else{v=5+doc['like_number'].value+doc['share_comment_number'].value} def last_utime=%f; def last_score=%d; if(v <= last_score && doc['update_time'].value.getMillis() > last_utime){return v}"
	//inline := "_score"
	inline2 := fmt.Sprintf(inline, float64(lastUpdateTime), lastScores)
	//fmt.Println("inline2: ", inline2)
	script := elastic.NewScript(inline2)
	fun01 := elastic.NewScriptFunction(script)

	func_score := elastic.NewFunctionScoreQuery()
	func_score.BoostMode("replace")
	func_score.MinScore(0)
	func_score.MaxBoost(10000000000000000000)

	condition := elastic.NewBoolQuery().Must(elastic.NewTermQuery("source", topicmodel.TopicTypeCircle))
	//Keys := []interface{}{"阿斯蒂芬", "圈子"}
	if len(Keys) > 0 {
		condition.Must(
			elastic.NewBoolQuery().Should(
				elastic.NewMatchQuery("name", Keys),
				elastic.NewMatchQuery("desc", Keys),
			),
		)
	}
	//excludeIds = []string{}
	var excludeQuery []elastic.Query
	if len(excludeIds) > 0 {
		for i := range excludeIds {
			excludeQuery = append(excludeQuery, elastic.NewTermQuery("id", excludeIds[i]))
		}
		condition.MustNot(excludeQuery...)
	}

	func_score.Query(condition)
	func_score.AddScoreFunc(fun01)

	sortScore := elastic.NewScoreSort().Desc()
	sortUpdateTime := elastic.NewFieldSort("update_time").Asc()
	sorters := make([]elastic.Sorter, 0)
	sorters = append(sorters, sortScore)
	sorters = append(sorters, sortUpdateTime)
	index := s.es.Search(IndexTopic).SortBy(sorters...).Query(func_score).Size(limit)
	result, err := index.Do(context.Background())

	if err != nil {
		s.logger.Error(err.Error())
		//fmt.Println("err:>>>>>>>>>>>>>>>", err.Error())
		return
	}

	return assembleResult(result), nil
}

type RecommendEs struct {
	ccEs
	Score uint64 `json:"score"`
}

func assembleResult(result *elastic.SearchResult) []*RecommendCircleEs  {
	arr := make([]*RecommendEs, 0, len(result.Hits.Hits))

	fmt.Println("hits.TotalHits: ", result.Hits.TotalHits)
	fmt.Println("result.Hits.Hits: ", result.Hits.Hits)
	for _, hits := range result.Hits.Hits {
		if hits.Source == nil || *hits.Score == 0 {
			continue
		}

		c := &RecommendEs{}
		err := json.Unmarshal(hits.Source, c)
		if err != nil {
			continue
		}
		circle.Score = uint64(*hits.Score)

		//fmt.Printf("circle%+v:>>>>>>>>>>>>>>>n", circle)
		//fmt.Printf("hits.score: %f, AA:%Tn", *hits.Score, *hits.Score)
		//fmt.Println("hits.index: ", hits.Index)
		//fmt.Println("hits.type: ", hits.Type)
		//fmt.Println("hits.id: ", hits.Id)

		arr = append(arr, c)
	}

	return arr
}

转载请注明:文章转载自 www.mshxw.com
本文地址:https://www.mshxw.com/it/906058.html
我们一直用心在做
关于我们 文章归档 网站地图 联系我们

版权所有 (c)2021-2022 MSHXW.COM

ICP备案号:晋ICP备2021003244-6号