這里使用Springboot 2.7.12版本,Elasticsearch為7.15.0。
導(dǎo)入依賴
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-data-elasticsearch</artifactId>
</dependency>
yaml文件配置:
elasticsearch:
uris: http://localhost:9200
構(gòu)建實(shí)體類,這里為商品的SKU屬性表
@Data
@Document(indexName = "skusearch")
public class SkuEs {
@Id
private String id;
@Field(type = FieldType.Text,analyzer = "ik_smart",searchAnalyzer = "ik_smart")
private String name;
private Integer price;
private Integer num;
private String image;
private String images;
private Date createTime;
private Date updateTime;
private String spuId;
private Integer categoryId;
//Keyword:不分詞
@Field(type= FieldType.Keyword)
private String categoryName;
private Integer brandId;
@Field(type=FieldType.Keyword)
private String brandName;
@Field(type=FieldType.Keyword)
private String skuAttribute;
private Integer status;
}
構(gòu)建service層進(jìn)行復(fù)雜查詢:指定條件查詢,聚合查詢,分頁查詢,排序查詢,高亮等等
@Service
public class SkuSearchServiceImpl implements SkuSearchService {
@Autowired
ElasticsearchRestTemplate elasticsearchRestTemplate;
@Override
public Map<String, Object> search(Map<String, Object> map) {
if(map!=null&&map.size()>0) {
NativeSearchQueryBuilder queryBuilder = queryBuilder(map);
//分組查詢
group(queryBuilder, map);
// NativeSearchQuery nativeSearchQuery = queryBuilder.build();
SearchHits<SkuEs> skuEsSearchHits = elasticsearchRestTemplate.search(queryBuilder.build(), SkuEs.class);
AggregationsContainer<?> aggregations = skuEsSearchHits.getAggregations();
Aggregations aggregations1 = (Aggregations) aggregations.aggregations();
Map<String, Object> searchMap = new HashMap<>();
//解析分組數(shù)據(jù)
parseGroup(aggregations1, searchMap);
//遍歷返回的內(nèi)容進(jìn)行處理
List<SearchHit<SkuEs>> searchHits = skuEsSearchHits.getSearchHits();
//將高亮的內(nèi)容填充到content中
List<SkuEs> skuEsList = searchHits.stream().map(i -> {
Map<String, List<String>> highlightFields = i.getHighlightFields();
List<String> name = highlightFields.get("name");
i.getContent().setName(name==null?i.getContent().getName():name.get(0));
return i.getContent();
}).collect(Collectors.toList());
//數(shù)據(jù)元素
searchMap.put("list", skuEsList);
//數(shù)據(jù)元素總數(shù)
searchMap.put("totalElements", skuEsList.size());
return searchMap;
}
return null;
}
public NativeSearchQueryBuilder queryBuilder(Map<String, Object> searchMap){
NativeSearchQueryBuilder queryBuilder=new NativeSearchQueryBuilder();
BoolQueryBuilder boolQueryBuilder=new BoolQueryBuilder();
if(searchMap!=null&&searchMap.size()>0){
//根據(jù)產(chǎn)品關(guān)鍵詞進(jìn)行查詢
String keyword = searchMap.get("keyword").toString();
if(!StringUtils.isEmpty(keyword))
boolQueryBuilder.must(QueryBuilders.termQuery("name",keyword));
//查詢指定的品牌
String brandName=searchMap.get("brand").toString();
if(!StringUtils.isEmpty(brandName)){
boolQueryBuilder.must(QueryBuilders.termQuery("brandName",brandName));
}
//根據(jù)價(jià)格進(jìn)行查詢,形式為gteprice-lteprice
String price = searchMap.get("price").toString();
if(!StringUtils.isEmpty(price)){
String[] split = price.split("-");
boolQueryBuilder.must(QueryBuilders.rangeQuery("price").gte(split[0]));
if(split.length>1)
boolQueryBuilder.must(QueryBuilders.rangeQuery("price").lte(split[1]));
}
}
//根據(jù)價(jià)格,對(duì)于查詢出來的產(chǎn)品進(jìn)行降序排列
queryBuilder.withSort(SortBuilders.fieldSort("price").order(SortOrder.DESC));
//分頁查詢
queryBuilder.withPageable(PageRequest.of(Integer.parseInt(searchMap.get("current").toString()),Integer.parseInt(searchMap.get("size").toString())));
queryBuilder.withQuery(boolQueryBuilder);
//高亮設(shè)置
queryBuilder.withHighlightFields(new HighlightBuilder.Field("name"));
queryBuilder.withHighlightBuilder(new HighlightBuilder().preTags("<em>").postTags("</em>"));
return queryBuilder;
}
public void group(NativeSearchQueryBuilder queryBuilder,Map<String, Object> searchMap){
//用戶如果沒有輸入分類條件,則需要將分類搜索出來,作為條件提供給用戶
if(StringUtils.isEmpty(searchMap.get("category"))){
queryBuilder.withAggregations(AggregationBuilders.terms("categoryList").
field("categoryName").size(100));
}
//用戶如果沒有輸入品牌條件,則需要將品牌搜索出來,作為條件提供給用戶
if(StringUtils.isEmpty(searchMap.get("brand"))){
queryBuilder.withAggregations(AggregationBuilders.terms("brandList")
.field("brandName").size(100));
}
}
//解析分組數(shù)據(jù)
public void parseGroup(Aggregations aggregations, Map<String,Object> resultMap){
if(aggregations!=null){
for (Aggregation aggregation : aggregations) {
ParsedStringTerms terms = (ParsedStringTerms) aggregation;
String name = terms.getName();
List<String> collect = terms.getBuckets().stream().map(i -> i.getKeyAsString()).collect(Collectors.toList());
resultMap.put(name,collect);
}
}
}
}
接口測(cè)試:
查詢?nèi)缦拢?/p>
{
"data": {
"categoryList": [
"軟件研發(fā)"
],
"brandList": [
"華為"
],
"list": [
{
"id": "1318594982227025922",
"name": "<em>華為</em>Mate40 Pro 32G",
"price": 114,
"num": 1228,
"image": "https://sklll.oss-cn-beijing.aliyuncs.com/secby/af1faf56-b10a-4700-9896-3143a2d1c40f.jpg",
"images": "https://sklll.oss-cn-beijing.aliyuncs.com/secby/a65bfbe4-21b7-42b2-b5cf-47a9730e0a16.jpg,https://sklll.oss-cn-beijing.aliyuncs.com/secby/fa52ef66-7724-4d6e-bece-15eba0f8f903.jpg,https://sklll.oss-cn-beijing.aliyuncs.com/secby/734f0f17-ac73-45d3-a6bf-83e1569ce887.jpg",
"createTime": "2020-10-20T08:48:37.000+00:00",
"updateTime": "2023-12-30T07:41:20.000+00:00",
"spuId": "1318594982147334146",
"categoryId": 11159,
"categoryName": "軟件研發(fā)",
"brandId": 11,
"brandName": "華為",
"skuAttribute": "{\"就業(yè)薪資\":\"10K起\",\"學(xué)習(xí)費(fèi)用\":\"2萬\"}",
"status": 1,
"attrMap": null
},
{
"id": "1318596430360813570",
"name": "<em>華為</em>Mate40 Pro 32G 1800萬像素",
"price": 112,
"num": 1227,
"image": "https://sklll.oss-cn-beijing.aliyuncs.com/secby/9247d041-e940-426c-8e50-06084b631063.jpg",
"images": "https://sklll.oss-cn-beijing.aliyuncs.com/secby/5f5b7435-6cf2-4797-8f65-d4abff181390.jpg",
"createTime": "2020-10-20T08:54:22.000+00:00",
"updateTime": "2023-12-30T07:41:21.000+00:00",
"spuId": "1318596430293704706",
"categoryId": 11159,
"categoryName": "軟件研發(fā)",
"brandId": 11,
"brandName": "華為",
"skuAttribute": "{\"就業(yè)薪資\":\"10K起\",\"學(xué)習(xí)費(fèi)用\":\"2萬\"}",
"status": 1,
"attrMap": null
},
{
"id": "1318596430398562305",
"name": "<em>華為</em>Mate40 Pro 128G",
"price": 111,
"num": 1226,
"image": "https://sklll.oss-cn-beijing.aliyuncs.com/secby/900a3618-9884-4778-bad9-c6c31eaf3eab.jpg",
"images": "https://sklll.oss-cn-beijing.aliyuncs.com/secby/5f5b7435-6cf2-4797-8f65-d4abff181390.jpg",
"createTime": "2020-10-20T08:54:22.000+00:00",
"updateTime": "2023-12-30T07:41:24.000+00:00",
"spuId": "1318596430293704706",
"categoryId": 11159,
"categoryName": "軟件研發(fā)",
"brandId": 11,
"brandName": "華為",
"skuAttribute": "{\"就業(yè)薪資\":\"10K起\",\"學(xué)習(xí)費(fèi)用\":\"2萬\"}",
"status": 1,
"attrMap": null
}
],
"totalElements": 3
},
"code": 20000,
"message": "操作成功"
}
?文章來源地址http://www.zghlxwxcb.cn/news/detail-772392.html
?文章來源:http://www.zghlxwxcb.cn/news/detail-772392.html
?
到了這里,關(guān)于Springboot整合Elasticsearch 7.X 復(fù)雜查詢的文章就介紹完了。如果您還想了解更多內(nèi)容,請(qǐng)?jiān)谟疑辖撬阉鱐OY模板網(wǎng)以前的文章或繼續(xù)瀏覽下面的相關(guān)文章,希望大家以后多多支持TOY模板網(wǎng)!