//三个属性,任一个命中即可,加上查询名称是为了高亮显示关键词
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]
}
}
欢迎分享,转载请注明来源:内存溢出
评论列表(0条)