使用elasticsearch 主要的一个场景就是分词查询,我以电商搜索商品为例:搜索“精华乳液套装”
搜索引擎(ik分词器)会拆成 精华、乳液、套装分别去匹配字段,会根据匹配度计算分值
条件组装
BoolQueryBuilder productNameIKBoolBuilder = QueryBuilders.boolQuery();
productNameIKBoolBuilder.must(QueryBuilders.matchQuery("productName.keyword_ik", searchRequestVO.getKeyword()));
// 设置是否按查询匹配度排序
searchSourceBuilder.minScore(0.25f);
searchSourceBuilder.explain(true);
Integer startPage = 1;
Integer pageSize = 10;
SearchSourceBuilder searchSourceBuilder = new SearchSourceBuilder();
searchSourceBuilder.from(startPage).size(pageSize);
//是否显示全部总数
searchSourceBuilder.trackTotalHits(true);
// 设置是否按查询匹配度排序
searchSourceBuilder.minScore(0.25f);
searchSourceBuilder.explain(true);
// Function Score Query
FunctionScoreQueryBuilder functionScoreQueryBuilder = QueryBuilders.functionScoreQuery(productNameIKBoolBuilder , ScoreFunctionBuilders.weightFactorFunction(1000));
searchSourceBuilder.query(functionScoreQueryBuilder);
SearchRequest searchRequest = new SearchRequest(indexEnum.getCode() + getActived());
searchRequest.source(searchSourceBuilder);
log.info("执行查询:{}", searchSourceBuilder.toString());
SearchResponse searchResponse = client.search(searchRequest, RequestOptions.DEFAULT);
/** 执行搜索,返回搜索响应信息 **/
long totalHits = searchResponse.getHits().getTotalHits().value;
long length = searchResponse.getHits().getHits().length;
log.info("查询到[{}]条数据,处理数据条数[{}]", totalHits, length);
不使用分词查询, elasticsearch也提供模糊查询功能,*表示任意字符
BoolQueryBuilder boolBuilderGoodsName = QueryBuilders.boolQuery();
boolBuilderGoodsName.must(QueryBuilders.wildcardQuery("productName", "*"+searchRequestVO.getKeyword()+"*"));