一、 什么是top热词?如何设计top热词榜功能?
1.大家可以看下百度搜索的风格,在进行搜索时,百度首页会出现一个热搜词榜单,如:
(一)、这种就是搜索功能的top热词榜单,这个榜单可以这后台配置,让租户或客户可以任意控制榜单的顺序,比如电商系统的热搜商品或热卖商品 这种可以可以设计成在后台运营可配置的热搜或热卖商品top榜单,这样商家可以任意设置top榜单,有效的提高运营手段。
(二)、第二种就是通过数据采集用户每次搜索的关键词,计算出top热搜榜单。这种也可以通过es中的aggregations聚合,相当于SQL中的group by,单个分组用指标聚合,terms相当于分组后统计各组的count结果,如:
"aggs": {
"hot_count" : {
"terms" : {
"field" : "search_input.hot"
}
}
}
java代码可以参照专栏的第三篇博客 聚合查询。
二、联想词设计
1、仍然是百度搜索,在我们输入某个词后,会出现搜索自动补全,这种也可以称为搜索联想词,如:
(一)、联想词也可以设计成后台可配置以及采集用户搜索热词的,建议这两种方案同时使用,联想词后台可配置部分可以进行人工干预排序等,可以有效的提高运营手段。
es索引结构可为:
@Data
@AllArgsConstructor
@NoArgsConstructor
@Builder
@Document(indexName = "test_index",shards = 6)
public class TestIndex {
/**
* 商品ID
*/
@Id
private String skuId;
/**
* sku状态 0删除 1正常
*/
@Field(type= FieldType.Integer)
private Integer skuState;
/**
* 商品标题
*/
@MultiField(mainField = @Field(type=FieldType.Text,analyzer = "ik_max_word",searchAnalyzer = "ik_smart"),
otherFields = {@InnerField(type=FieldType.Text,suffix = "pinyin",analyzer = "pinyin"),@InnerField(type=FieldType.Keyword,suffix = "raw")})
private String skuTitle;
// 联想词类型
@CompletionField(analyzer="ik_max_word",searchAnalyzer="ik_max_word", maxInputLength = 100)
private Completion suggestWord;
}
(二)、插入索引,以及搜索补全
// 使用suggest进行标题联想
CompletionSuggestionBuilder suggest = SuggestBuilders.completionSuggestion("suggestWord")
// 关键字(参数传此)
.prefix(keyword)
// 重复过滤
.skipDuplicates(true)
// 匹配数量
.size(10);
SuggestBuilder suggestBuilder = new SuggestBuilder();
suggestBuilder.addSuggestion("mySuggest",suggest);
IndexCoordinates indexCoordinates = elasticsearchOperations.getIndexCoordinatesFor(TestIndex.class);
// 查询
SearchResponse suggestResp = elasticsearchRestTemplate.suggest(suggestBuilder, indexCoordinates);
Suggest.Suggestion<? extends Suggest.Suggestion.Entry<? extends Suggest.Suggestion.Entry.Option>> goodsNameSuggest = suggestResp .getSuggest().getSuggestion("mySuggest");
// 处理返回
List<String> suggests = goodsNameSuggest.getEntries().stream().map(x -> x.getOptions().stream().map(y->y.getText().toString()).collect(Collectors.toList())).findFirst().get();
// 输出内容
for (String suggest : suggests) {
System.out.println("suggest = " + suggest);
}