javascript
ik分词器实现原理_SpringBoot整合Elasticsearch实现商品搜索
中文分詞器
- Elasticsearch有默認的分詞器,默認分詞器只是將中文逐詞分隔,并不符合我們的需求。
- 需要安裝與Elasticsearch版本相同的ik分詞器,ik分詞器將小米手機分為小米和手機,符合我們的要求。
在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;
相關商品推薦
當我們查看相關商品的時候,一般底部會有一些商品推薦,這里使用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实现商品搜索的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 北汽集团计划进入俄罗斯市场 与俄经销商达
- 下一篇: chatgpt是什么意思