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("<font color='red'>")
    re.PostTags("</font>")
    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]
    }
}

  • 0
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值