(四)联想词和top热词的设计与开发

一、 什么是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);
        }
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

要成为码神的男人

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值