当前位置:   article > 正文

(四)联想词和top热词的设计与开发_网站 搜索热词功能

网站 搜索热词功能

一、 什么是top热词?如何设计top热词榜功能?

1.大家可以看下百度搜索的风格,在进行搜索时,百度首页会出现一个热搜词榜单,如:

在这里插入图片描述

(一)、这种就是搜索功能的top热词榜单,这个榜单可以这后台配置,让租户或客户可以任意控制榜单的顺序,比如电商系统的热搜商品或热卖商品 这种可以可以设计成在后台运营可配置的热搜或热卖商品top榜单,这样商家可以任意设置top榜单,有效的提高运营手段。
(二)、第二种就是通过数据采集用户每次搜索的关键词,计算出top热搜榜单。这种也可以通过es中的aggregations聚合,相当于SQL中的group by,单个分组用指标聚合,terms相当于分组后统计各组的count结果,如:

 "aggs": {
     "hot_count" : {
       "terms" : {
         "field" : "search_input.hot"
       }
     }
   }

  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8

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;
}
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13
  • 14
  • 15
  • 16
  • 17
  • 18
  • 19
  • 20
  • 21
  • 22
  • 23
  • 24
  • 25
  • 26
  • 27
  • 28
  • 29

(二)、插入索引,以及搜索补全

 // 使用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);
        }
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13
  • 14
  • 15
  • 16
  • 17
  • 18
  • 19
  • 20
  • 21
  • 22
声明:本文内容由网友自发贡献,不代表【wpsshop博客】立场,版权归原作者所有,本站不承担相应法律责任。如您发现有侵权的内容,请联系我们。转载请注明出处:https://www.wpsshop.cn/w/繁依Fanyi0/article/detail/882598
推荐阅读
相关标签
  

闽ICP备14008679号