SpringBoot项目集成Elasticsearch实例
导包
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-data-elasticsearch</artifactId>
</dependency>
配置es连接
spring:
data:
elasticsearch:
cluster-name: elasticsearch
cluster-nodes: 127.0.0.1:9300
准备query接收查询条件
@Data
public class CarSearchQuery extends BaseQuery {
private Long carType;
private Double maxPrice;
private Double minPrice;
//0 以下 1 以上
private Integer carAgeType;
private Integer carAge;
//是否超值
private Integer costEffective;
//急售
private Integer rushSale;
//准新车
private Integer quasiNewCar;
//可迁全国
private Integer transitiveCountry;
//排序字段
private String sortField;
//排序类型 desc降序 asc升序号
private String sortType;
private Double longitude;
private Double latitude;
private Double distance;
private Long shopId;
}
准备Controller
@RestController
@RequestMapping("/car/search")
public class CarSearchController {
@Autowired
private ICarSearchService carSearchService;
@PostMapping
public AjaxResult search(@RequestBody CarSearchQuery query) {
PageList<CarDoc> search = carSearchService.search(query);
return AjaxResult.me().setData(search);
}
}
定义Document文档类型
@Data
@AllArgsConstructor
@NoArgsConstructor
@Document(indexName = "example-car", type = "car")
public class CarDoc {
@Id
private Long id;
@Field(type = FieldType.Text, analyzer = "ik_smart", searchAnalyzer = "ik_smart")
private String title;
@Field(type = FieldType.Keyword)
private String cover;
@Field(type = FieldType.Double)
private BigDecimal salePrice;
@Field(type = FieldType.Double)
private BigDecimal costPrice;
@Field(type = FieldType.Integer)
private Integer isNew;
@Field(type = FieldType.Date)
private Date registerTime;
@Field(type = FieldType.Double)
private Double mileAge;
@Field(type = FieldType.Long)
private Long shopId;
@MultiField(mainField = @Field(type = FieldType.Text, analyzer = "ik_smart", searchAnalyzer = "ik_smart"),
otherFields = {
@InnerField(type = FieldType.Keyword, suffix = "keyword")})
private String shopName; // @MultiField对同一字段应用不同的分析器或存储策略,这里既可以将该字段按照text进行拆分,也可以作为keyword进行查询
@Field(type = FieldType.Keyword)
private String shopAddress;
@Field(type = FieldType.Date)
private Date onSaleTime;
@Field(type = FieldType.Integer)
private Integer costEffective;
@Field(type = FieldType.Integer)
private Integer rushSale;
@Field(type = FieldType.Integer)
private Integer quasiNewCar;
@Field(type = FieldType.Integer)
private Integer transitiveCountry;
@Field(type = FieldType.Long)
private Long typeId;
@MultiField(mainField = @Field(type = FieldType.Text, analyzer = "ik_smart", searchAnalyzer = "ik_smart"),
otherFields =