依赖
<dependency>
<groupId>cn.easy-es</groupId>
<artifactId>easy-es-boot-starter</artifactId>
<version>1.1.1</version>
</dependency>
实体类Dao
import cn.easyes.annotation.HighLight;
import cn.easyes.annotation.IndexField;
import cn.easyes.annotation.IndexId;
import cn.easyes.annotation.IndexName;
import cn.easyes.annotation.rely.Analyzer;
import cn.easyes.annotation.rely.FieldType;
import cn.easyes.annotation.rely.IdType;
import lombok.Data;
@Data
@IndexName("demo")
public class Demo {
@IndexId(type = IdType.CUSTOMIZE)
private Integer id;
private String type;
@HighLight
@IndexField(fieldType = FieldType.TEXT, analyzer = Analyzer.IK_SMART, searchAnalyzer = Analyzer.IK_MAX_WORD)
private String title;
private BigDecimal price;
@IndexField(fieldType = FieldType.TEXT, analyzer = Analyzer.IK_SMART)
private List<String> features;
private Double area;
@IndexField(fieldType = FieldType.GEO_POINT)
private String location;
}
Mapper
import cn.easyes.core.conditions.interfaces.BaseEsMapper;
public interface DemoMapper extends BaseEsMapper<Demo> {
}
Search实体
import lombok.Data;
@Data
public class DemoParam {
private String searchWord;
@Data
public static class Subway{
private Double lon;
private Double lat;
}
private Subway subway;
private String type;
private BigDecimal priceLow;
private BigDecimal priceUp;
private List<String> features;
private Boolean priceIsAsc;
private Integer pageNum = 1;
private Integer pageSize = 20;
}
Service
import cn.easyes.core.biz.EsPageInfo;
import cn.easyes.core.conditions.LambdaEsQueryWrapper;
import cn.gcfc.monitor.service.house.HouseSearchService;
import cn.hutool.core.bean.BeanUtil;
import cn.hutool.core.collection.CollUtil;
import cn.hutool.core.util.ObjectUtil;
import cn.hutool.core.util.StrUtil;
import lombok.extern.slf4j.Slf4j;
import org.elasticsearch.common.geo.GeoPoint;
import org.elasticsearch.common.unit.DistanceUnit;
@Service
@Slf4j
public class DemoServiceImpl implements DemoService {
@Resource
private DemoMapper demoMapper;
@Override
public List<DemoVO> houseVisitorModelSearch(DemoParam demoParam) {
LambdaEsQueryWrapper<Demo> wrapper = new LambdaEsQueryWrapper<>();
wrapper.match(StrUtil.isNotBlank(demoParam.getSearchWord()), Demo::getTitle, demoParam.getSearchWord())
.ge(ObjectUtil.isNotEmpty(demoParam.getPriceLow()), Demo::getPrice, demoParam.getPriceLow())
.le(ObjectUtil.isNotEmpty(demoParam.getPriceUp()), Demo::getPrice, demoParam.getPriceUp())
.in(CollUtil.isNotEmpty(demoParam.getFeatures()), Demo::getFeatures, demoParam.getFeatures())
.eq(StrUtil.isNotBlank(demoParam.getType()), Demo::getType, demoParam.getType());
DemoParam.Subway subway = demoParam.getSubway();
if (ObjectUtil.isNotEmpty(subway)) {
Double lon = subway.getLon();
Double lat = subway.getLat();
wrapper.geoDistance(Demo::getLocation, 2.0, DistanceUnit.KILOMETERS, new GeoPoint(lat, lon));
}
Boolean priceIsAsc = demoParam.getPriceIsAsc();
if (ObjectUtil.isNotEmpty(priceIsAsc)) {
if (priceIsAsc) {
wrapper.orderByAsc(Demo::getPrice);
} else {
wrapper.orderByDesc(Demo::getPrice);
}
}
EsPageInfo<Demo> pageInfo = demoMapper.pageQuery(wrapper, demoParam.getPageNum(), demoParam.getPageSize());
List<Demo> demoList = pageInfo.getList();
return BeanUtil.copyToList(demoList, DemoVO.class);
}
}