package com.example.demoes0.bean;
import lombok.Data;
import org.springframework.data.annotation.Id;
import org.springframework.data.elasticsearch.annotations.Document;
import org.springframework.data.elasticsearch.annotations.Field;
import org.springframework.data.elasticsearch.annotations.FieldType;
import java.io.Serializable;
import java.math.BigDecimal;
@Document(indexName = "yproduct")
@Data
public class YProduct implements Serializable {
private static final long serialVersionUID = -1L;
@Id
private Long id;
@Field(analyzer = "ik_max_word",type = FieldType.Text, searchAnalyzer = "ik_max_word")
private String name;
@Field(analyzer = "ik_max_word",type = FieldType.Text, searchAnalyzer = "ik_max_word")
private String subTitle;
@Field(analyzer = "ik_max_word",type = FieldType.Text, searchAnalyzer = "ik_max_word")
private String keywords;
private Integer brandId;// 品牌
private Integer categoryId;// 类别
private Integer sale;// 销售数量
private BigDecimal price;
}
=======================================
package com.example.demoes0.repository;
import com.example.demoes0.bean.YProduct;
import org.springframework.data.elasticsearch.repository.ElasticsearchRepository;
public interface YProductRepository extends ElasticsearchRepository<YProduct, Long> {
}
========================================
package com.example.demoes0.service;
import com.example.demoes0.bean.YProduct;
import org.springframework.data.domain.Page;
public interface YProductService {
Page<YProduct> search(String search, Integer brandId, Integer categoryId, Integer page, Integer limit);
int importYProduct();
YProduct add();
}
=========================================
package com.example.demoes0.service.impl;
import com.example.demoes0.bean.YProduct;
import com.example.demoes0.repository.YProductRepository;
import com.example.demoes0.service.YProductService;
import org.elasticsearch.common.lucene.search.function.FunctionScoreQuery;
import org.elasticsearch.index.query.BoolQueryBuilder;
import org.elasticsearch.index.query.QueryBuilders;
import org.elasticsearch.index.query.functionscore.FunctionScoreQueryBuilder;
import org.elasticsearch.index.query.functionscore.ScoreFunctionBuilders;
import org.elasticsearch.search.sort.SortBuilders;
import org.elasticsearch.search.sort.SortOrder;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.data.domain.Page;
import org.springframework.data.domain.PageRequest;
import org.springframework.data.elasticsearch.core.query.NativeSearchQuery;
import org.springframework.data.elasticsearch.core.query.NativeSearchQueryBuilder;
import org.springframework.stereotype.Service;
import java.util.ArrayList;
import java.util.List;
@Service
public class YProductServiceImpl implements YProductService {
@Autowired
private YProductRepository yProductRepository;
@Override
public Page<YProduct> search(String search, Integer brandId, Integer categoryId, Integer page, Integer limit) {
// 不作空判断
NativeSearchQueryBuilder nativeSearchQueryBuilder = new NativeSearchQueryBuilder();// 搜索
// 分页
PageRequest pageRequest = PageRequest.of(page, limit);
nativeSearchQueryBuilder.withPageable(pageRequest);
// 过滤品牌与类别等
BoolQueryBuilder boolQueryBuilder = QueryBuilders.boolQuery();
boolQueryBuilder.must(QueryBuilders.termQuery("brandId", brandId));
boolQueryBuilder.must(QueryBuilders.termQuery("categoryId",categoryId));
nativeSearchQueryBuilder.withFilter(boolQueryBuilder);
// 下面参考地址
// 全部搜索
// nativeSearchQueryBuilder.withQuery(QueryBuilders.matchAllQuery());
// 搜索范围:商品名称、副标题、关键字 (权重)
List<FunctionScoreQueryBuilder.FilterFunctionBuilder> filterFunctionBuilders = new ArrayList<>();
filterFunctionBuilders.add(new FunctionScoreQueryBuilder.FilterFunctionBuilder(QueryBuilders.matchQuery("name", search), ScoreFunctionBuilders.weightFactorFunction(10)));
filterFunctionBuilders.add(new FunctionScoreQueryBuilder.FilterFunctionBuilder(QueryBuilders.matchQuery("subTitle", search), ScoreFunctionBuilders.weightFactorFunction(7)));
filterFunctionBuilders.add(new FunctionScoreQueryBuilder.FilterFunctionBuilder(QueryBuilders.matchQuery("keywords", search), ScoreFunctionBuilders.weightFactorFunction(5)));
FunctionScoreQueryBuilder functionScoreQueryBuilder = QueryBuilders.functionScoreQuery(filterFunctionBuilders.stream().toArray(FunctionScoreQueryBuilder.FilterFunctionBuilder[] :: new)).scoreMode(FunctionScoreQuery.ScoreMode.SUM).setMinScore(2);// 小于等于1的没中
nativeSearchQueryBuilder.withQuery(functionScoreQueryBuilder);
// 排序:价格、销售数量、新品、搜索结果
nativeSearchQueryBuilder.withSort(SortBuilders.fieldSort("id").order(SortOrder.DESC));// 新品
// nativeSearchQueryBuilder.withSort(SortBuilders.fieldSort("sale").order(SortOrder.DESC));// 销售数量 高 -> 低
// nativeSearchQueryBuilder.withSort(SortBuilders.fieldSort("sale").order(SortOrder.ASC));// 销售数量 低 -> 高
// nativeSearchQueryBuilder.withSort(SortBuilders.fieldSort("price").order(SortOrder.DESC));// 价格 高 -> 低
// nativeSearchQueryBuilder.withSort(SortBuilders.fieldSort("price").order(SortOrder.ASC));// 价格 低 -> 高
//nativeSearchQueryBuilder.withSort(SortBuilders.scoreSort().order(SortOrder.DESC));// 按原来的搜索结果排序
//nativeSearchQueryBuilder.withSort(SortBuilders.scoreSort().order(SortOrder.DESC));
NativeSearchQuery nativeSearchQuery = nativeSearchQueryBuilder.build();
return yProductRepository.search(nativeSearchQuery);
}
@Override
public int importYProduct() {
int number = 0;
/*List<YProduct> list = new ArrayList<>();
list.add(new YProduct(1L, "苹果手机8", "这是苹果第8款手机","苹果,8,IOS", 1, 2, 100, new BigDecimal("4567.88")));
list.add(new YProduct(2L, "安卓手机小米", "这是安卓手机小米","安卓,小米", 2, 3, 300, new BigDecimal("2000.88")));
list.add(new YProduct(3L, "安卓手机华为", "这是手机华为","华为,安卓", 2, 3, 200, new BigDecimal("2365.88")));
Iterable<YProduct> yProducts = yProductRepository.saveAll(list);
Iterator<YProduct> iterator = yProducts.iterator();
while (iterator.hasNext()) {
iterator.next();
number++;
}*/
return number;
}
@Override
public YProduct add() {
return null;
}
// 删除
}
===================================
spring:
data:
elasticsearch:
repositories:
enabled: true
cluster-nodes: 192.168.0.104:9300
===================不断补充==================
新版用elasticsearchRestTemplate
SearchHits<Product> searchHits = elasticsearchRestTemplate.search(nativeSearchQuery, Product.class);
SearchPage<Product> page = SearchHitSupport.searchPageFor(searchHits, nativeSearchQuery.getPageable());
部分资料
参考:https://blog.csdn.net/laoyang360/article/details/82950393
参考:https://blog.csdn.net/wojiushiwo987/category_9266239.html