栏目分类:
子分类:
返回
名师互学网用户登录
快速导航关闭
当前搜索
当前分类
子分类
实用工具
热门搜索
名师互学网 > IT > 前沿技术 > 云计算 > 云平台

GO 操作Elasticsearch(ES)完整代码

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

GO 操作Elasticsearch(ES)完整代码

        //三个属性,任一个命中即可,加上查询名称是为了高亮显示关键词

        boolQ := elastic.NewBoolQuery()
        nameQuery := elastic.NewMatchQuery("alias", Key).Boost(1024).QueryName("f_first")
        descriptionQuery := elastic.NewMatchQuery("description", Key).Boost(1.5).QueryName("f_second")
        topicsQuery := elastic.NewMatchQuery("topics", Key).Boost(1).QueryName("f_third")
        boolQ.Should(nameQuery, descriptionQuery, topicsQuery)

        //执行搜索,两个排序条件,先最佳匹配,如果得分一样,则使用第二个条件进行排序。

        //分页查询,from为起始位置,size返回记录数,并对查询字段返回高亮显示内容。

        res, err := client.Search(TableName).Query(boolQ).SortBy(getSort(SortBy, ascending, "num_stars", false)...).From(from).Size(Size).Highlight(queryHighlight("alias", "description", "topics")).Do(ctx.Req.Context())
        if err == nil {
          //打印返回的json字符串

            searchJson, _ := json.Marshal(res)

        
            log.Info("searchJson=" + string(searchJson))
            for i, hit := range res.Hits.Hits {

               //遍历命中的每条记录。先将记录反序列化为Map结构
                log.Info("this is repo query " + fmt.Sprint(i) + " result.")
                recordSource := make(map[string]interface{})
                source, err := hit.Source.MarshalJSON()

                if err == nil {
                    err = json.Unmarshal(source, &recordSource)
                    if err == nil {
                        record := make(map[string]interface{})
                        record["id"] = hit.Id
                        record["alias"] = getLabelValue("alias", recordSource, hit.Highlight)
                        record["real_name"] = recordSource["name"]
                        record["owner_name"] = recordSource["owner_name"]
                        ...
                    }
                }
            }
        }

//高亮设置。即标红,也可以自由设置。

func queryHighlight(names ...string) *elastic.Highlight {
    re := elastic.NewHighlight()
    for i := 0; i < len(names); i++ {
        field := &elastic.HighlighterField{
            Name: names[i],
        }
        re.Fields(field)
    }
    re.PreTags("")
    re.PostTags("
")
    return re
}

//多个条件排序设置。

func getSort(SortBy string, ascending bool, secondSortBy string, secondAscending bool) []elastic.Sorter {
    sort := make([]elastic.Sorter, 0)
    if SortBy == "default" || SortBy == "" {
        sort = append(sort, elastic.NewScoreSort())
        if secondSortBy != "" {
            log.Info("SortBy=" + SortBy + " secondSortBy=" + secondSortBy)
            sort = append(sort, elastic.NewFieldSort(secondSortBy).Order(secondAscending))
        }
    } else {
        sort = append(sort, elastic.NewFieldSort(SortBy).Order(ascending))
    }
    log.Info("sort size=" + fmt.Sprint(len(sort)))
    return sort
}

//返回界面显示时,如果有高亮命中,则使用高亮内容显示。

func getLabelValue(key string, recordSource map[string]interface{}, searchHighliht elastic.SearchHitHighlight) string {
    if value, ok := searchHighliht[key]; !ok {
        if recordSource[key] != nil {
            return recordSource[key].(string)
        } else {
            return ""
        }
    } else {
        return value[0]
    }
}

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

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

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