日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 > 前端技术 > javascript >内容正文

javascript

ik分词器实现原理_SpringBoot整合Elasticsearch实现商品搜索

發布時間:2023/12/15 javascript 29 豆豆
生活随笔 收集整理的這篇文章主要介紹了 ik分词器实现原理_SpringBoot整合Elasticsearch实现商品搜索 小編覺得挺不錯的,現在分享給大家,幫大家做個參考.
本文主要介紹在Elasticsearch中實現商品搜索功能

中文分詞器

  • Elasticsearch有默認的分詞器,默認分詞器只是將中文逐詞分隔,并不符合我們的需求。
get hanzo/_analyze { "text": "小米手機", "tokenizer": "standard" }
  • 需要安裝與Elasticsearch版本相同的ik分詞器,ik分詞器將小米手機分為小米和手機,符合我們的要求。
get hanzo/_analyze {"text": "小米手機","tokenizer": "ik_max_word" }

在SpringBoot中使用

在商品信息實體類中用@Document、@Field等注解。對于需要中文分詞的字段,我們直接使用@Field注解屬性設置為ik_max_word。

/*** @Author 皓宇QAQ* @Date 2020/6/4 20:49* @Description:搜索中的商品信息*/ @Document(indexName = "hanzo", type = "product",shards = 1,replicas = 0) @Data public class EsProduct implements Serializable {private static final long serialVersionUID = -1L;@Idprivate Long goodsId;@Field(analyzer = "ik_max_word",type = FieldType.Text)private String goodsName;@Field(analyzer = "ik_max_word",type = FieldType.Text)private String goodsIntro;private Long goodsCategoryId;private String goodsCoverImg;private String goodsCarousel;private Integer originalPrice;private Integer sellingPrice;private Integer stockNum;private String tag;private Byte goodsSellStatus;private Integer createUser;@JsonFormat(pattern = "yyyy-MM-dd HH:mm:ss", timezone = "GMT+8")private Date createTime;private Integer updateUser;@JsonFormat(pattern = "yyyy-MM-dd HH:mm:ss", timezone = "GMT+8")private Date updateTime;@Field(type = FieldType.Keyword)private String goodsDetailContent; }

簡單商品搜索

先實現一個最簡單的商品搜索功能,搜索包括商品名稱,商品簡介,商品標簽中包含指定的關鍵字的商品和一個直接根據商品分類進行查詢商品的功能
  • 在SpringBoot中實現,使用Elasticsearch Repositories的衍生查詢來搜索;

```java public interface EsProductRepository extends ElasticsearchRepository { / * 衍生搜索關鍵字查詢 * @param goodsName 商品名稱 * @param goodsIntro 商品簡介 * @param tag 商品標簽 * @param page 分頁信息 * @return / Page findByGoodsNameOrGoodsIntroOrTag(String goodsName, String goodsIntro, String tag,Pageable page);

/*** 衍生搜索商品分類定位查詢** @param goodsCategoryId 商品分類* @param page 分頁信息* @return*/Page<EsProduct> findByGoodsCategoryId(Long goodsCategoryId, Pageable page);

} ```

  • 衍生查詢其實原理很簡單,就是將一定規則方法名稱的方法轉化為Elasticsearch的Query DSL語句,看完下面這張表你就懂了。

綜合商品搜索

接下來我們來實現一個復雜的商品搜索,涉及到過濾、不同字段匹配權重不同以及可以進行排序。
  • 首先來說下我們的需求,按輸入的關鍵字搜索商品名稱、商品簡介和 商品標簽,默認按相關度進行排序;
  • 這里我們有一點特殊的需求,比如商品名稱匹配關鍵字的的商品我們認為與搜索條件更匹配,其次是商品簡介和商品標簽,這時就需要用到function_score查詢了;
  • 在Elasticsearch中搜索到文檔的相關性由_score字段來表示的,文檔的_score字段值越高,表示與搜索條件越匹配,而function_score查詢可以通過設置權重來影響_score字段值,使用它我們就可以實現上面的需求了;
  • 在SpringBoot中實現,使用Elasticsearch Repositories的search方法來實現,但需要自定義查詢條件QueryBuilder;
@Overridepublic Page<EsProduct> sortSearch(String keyword, Integer pageNum, Integer pageSize, Integer sort) {Pageable pageable = PageRequest.of(pageNum, pageSize);NativeSearchQueryBuilder nativeSearchQueryBuilder = new NativeSearchQueryBuilder();//分頁nativeSearchQueryBuilder.withPageable(pageable);//過濾//搜索if (StringUtils.isEmpty(keyword)) {nativeSearchQueryBuilder.withQuery(QueryBuilders.matchAllQuery());} else {List<FunctionScoreQueryBuilder.FilterFunctionBuilder> filterFunctionBuilders = new ArrayList<>();filterFunctionBuilders.add(new FunctionScoreQueryBuilder.FilterFunctionBuilder(QueryBuilders.matchQuery("goodsName", keyword),ScoreFunctionBuilders.weightFactorFunction(10)));filterFunctionBuilders.add(new FunctionScoreQueryBuilder.FilterFunctionBuilder(QueryBuilders.matchQuery("goodsIntro", keyword),ScoreFunctionBuilders.weightFactorFunction(5)));filterFunctionBuilders.add(new FunctionScoreQueryBuilder.FilterFunctionBuilder(QueryBuilders.matchQuery("tag", keyword),ScoreFunctionBuilders.weightFactorFunction(2)));FunctionScoreQueryBuilder.FilterFunctionBuilder[] builders = new FunctionScoreQueryBuilder.FilterFunctionBuilder[filterFunctionBuilders.size()];filterFunctionBuilders.toArray(builders);FunctionScoreQueryBuilder functionScoreQueryBuilder = QueryBuilders.functionScoreQuery(builders).scoreMode(FunctionScoreQuery.ScoreMode.SUM).setMinScore(2);nativeSearchQueryBuilder.withQuery(functionScoreQueryBuilder);}//排序if(sort==1){//按新品從新到舊nativeSearchQueryBuilder.withSort(SortBuilders.fieldSort("goodsId").order(SortOrder.DESC));}else if(sort==2){//按庫存從高到低nativeSearchQueryBuilder.withSort(SortBuilders.fieldSort("stockNum").order(SortOrder.DESC));}else if(sort==3){//按價格從低到高nativeSearchQueryBuilder.withSort(SortBuilders.fieldSort("sellingPrice").order(SortOrder.ASC));}else if(sort==4){//按價格從高到低nativeSearchQueryBuilder.withSort(SortBuilders.fieldSort("sellingPrice").order(SortOrder.DESC));}else{//按相關度nativeSearchQueryBuilder.withSort(SortBuilders.scoreSort().order(SortOrder.DESC));}nativeSearchQueryBuilder.withSort(SortBuilders.scoreSort().order(SortOrder.DESC));NativeSearchQuery searchQuery = nativeSearchQueryBuilder.build();log.info("DSL:{}", searchQuery.getQuery().toString());return productRepository.search(searchQuery);}

相關商品推薦

當我們查看相關商品的時候,一般底部會有一些商品推薦,這里使用Elasticsearch來簡單實現下。
  • 首先來說下我們的需求,可以根據指定商品的ID來查找相關商品;
  • 這里我們的實現原理是這樣的:首先根據ID獲取指定商品信息,然后以指定商品的名稱、商品簡介、商品標簽和分類來搜索商品,并且要過濾掉當前商品,調整搜索條件中的權重以獲取最好的匹配度;
  • 在SpringBoot中實現,使用Elasticsearch Repositories的search方法來實現,但需要自定義查詢條件QueryBuilder;

java @Override public Page<EsProduct> recommend(Long id, Integer pageNum, Integer pageSize) { Pageable pageable = PageRequest.of(pageNum, pageSize); List<EsProduct> esProductList = productDao.getAllEsProductList(id); if (esProductList.size() > 0) { EsProduct esProduct = esProductList.get(0); String keyword = esProduct.getGoodsName(); Long goodsCategoryId = esProduct.getGoodsCategoryId(); //根據商品名稱、商品簡介,商品標簽,分類進行搜索 List<FunctionScoreQueryBuilder.FilterFunctionBuilder> filterFunctionBuilders = new ArrayList<>(); filterFunctionBuilders.add(new FunctionScoreQueryBuilder.FilterFunctionBuilder(QueryBuilders.matchQuery("goodsName", keyword), ScoreFunctionBuilders.weightFactorFunction(8))); filterFunctionBuilders.add(new FunctionScoreQueryBuilder.FilterFunctionBuilder(QueryBuilders.matchQuery("goodsIntro", keyword), ScoreFunctionBuilders.weightFactorFunction(2))); filterFunctionBuilders.add(new FunctionScoreQueryBuilder.FilterFunctionBuilder(QueryBuilders.matchQuery("tag", keyword), ScoreFunctionBuilders.weightFactorFunction(2))); filterFunctionBuilders.add(new FunctionScoreQueryBuilder.FilterFunctionBuilder(QueryBuilders.matchQuery("goodsCategoryId", goodsCategoryId), ScoreFunctionBuilders.weightFactorFunction(6))); FunctionScoreQueryBuilder.FilterFunctionBuilder[] builders = new FunctionScoreQueryBuilder.FilterFunctionBuilder[filterFunctionBuilders.size()]; filterFunctionBuilders.toArray(builders); FunctionScoreQueryBuilder functionScoreQueryBuilder = QueryBuilders.functionScoreQuery(builders) .scoreMode(FunctionScoreQuery.ScoreMode.SUM) .setMinScore(2); NativeSearchQueryBuilder builder = new NativeSearchQueryBuilder(); builder.withQuery(functionScoreQueryBuilder); builder.withPageable(pageable); NativeSearchQuery searchQuery = builder.build(); log.info("DSL:{}", searchQuery.getQuery().toString()); return productRepository.search(searchQuery); } return new PageImpl<>(null); }

參考代碼以及接口文檔

Github

Swagger UI 文檔

總結

知識只有分享出來才有價值。如果有問題的話,可以在關于我的頁面,通過我的郵箱聯系我進行探討。

總結

以上是生活随笔為你收集整理的ik分词器实现原理_SpringBoot整合Elasticsearch实现商品搜索的全部內容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網站內容還不錯,歡迎將生活随笔推薦給好友。