6.Spring Data Elasticsearch入门

目录:
1.安装Elasticsearch
2.Elasticsearch概念
3.Elasticsearch索引
4.Elasticsearch查询
5.Elasticsearch聚合aggregations
6.Spring Data Elasticsearch入门
7.Repository文档操作

1.注解说明

Spring Data通过注解来声明实体类字段的映射属性,有下面的三个注解:

  • @Document 作用在类,标记实体类为文档对象,一般有两个属性
    • indexName:对应索引库名称
    • type:对应在索引库中的类型
    • shards:分片数量,默认5
    • replicas:副本数量,默认1
  • @Id 作用在成员变量,标记一个字段作为id主键
  • @Field 作用在成员变量,标记为文档的字段,并指定字段映射属性:
    • type:字段类型,取值是枚举:FieldType
    • index:是否索引,布尔类型,默认是true
    • store:是否存储,布尔类型,默认是false
    • analyzer:分词器名称

2.示例

2.1 实体类实例
@Data
@NoArgsConstructor
@AllArgsConstructor
@ApiModel("es-产品")
@Document(indexName = "product", type = "phone",shards = 2,replicas = 0)
public class EsProduct {

	/**  */
	@ApiModelProperty("")
	@Id
	private Long id;
	/** 这条记录所有需要被搜索信息的拼接,后面拿关键字查询匹配这个字段 */
	@Field(analyzer = "ik_max_word",type = FieldType.Text)
	private String keywordsAll;
	/** 分类id */
	@ApiModelProperty("分类id")
	@Field(type = FieldType.Long,index = false)
	private Long catalogId;
	/** 产品名称 */
	@ApiModelProperty("产品名称")
	@Field(type = FieldType.Keyword)
	private String productName;
	/** 单价 */
	@ApiModelProperty("单价")
	@Field(type = FieldType.Double)
	private BigDecimal price;
	/** 属性1 */
	@ApiModelProperty("属性1")
	@Field(type = FieldType.Keyword)
	private String attr1;
	/** 属性2 */
	@ApiModelProperty("属性2")
	@Field(type = FieldType.Keyword)
	private String attr2;
	/** 属性3 */
	@ApiModelProperty("属性3")
	@Field(type = FieldType.Keyword)
	private String attr3;

	Map<String, Object> map;
}
2.2 ElasticsearchRepository实例
public interface EsProductRepository extends ElasticsearchRepository<EsProduct, Long> {
    /**
     * 根据属性1查询
     * @param attr1
     * @param pageable
     * @return
     */
    Page<EsProduct> findByAttr1(String attr1, Pageable pageable);
}

3.创建索引及映射

public void createIndex() {
	// 创建索引及映射
    this.elasticsearchTemplate.createIndex(EsProduct.class);
    // 配置映射
//        this.elasticsearchTemplate.putMapping(EsProduct.class);
}

4.简单查询

public Page<EsProduct> pageList(Integer pageNum, Integer pageSize, String keywords) {
	// 分页
	Pageable pageable = PageRequest.of(pageNum, pageSize);
	NativeSearchQueryBuilder nativeSearchQueryBuilder = new NativeSearchQueryBuilder();
	nativeSearchQueryBuilder.withPageable(pageable);
	BoolQueryBuilder boolQueryBuilder = QueryBuilders.boolQuery();
	if (StringUtils.isEmpty(keywords)) {
		nativeSearchQueryBuilder.withQuery(QueryBuilders.matchAllQuery());
	} else {
		// 关键字查询
		boolQueryBuilder.must(QueryBuilders.matchQuery("keywordsAll", keywords));
		// 价格范围
		boolQueryBuilder.must(QueryBuilders.rangeQuery("price").from(2000D).to(6000D));
	}
	nativeSearchQueryBuilder.withQuery(boolQueryBuilder);
	// 根据价格倒序
	nativeSearchQueryBuilder.withSort(SortBuilders.fieldSort("price").order(SortOrder.DESC));
	NativeSearchQuery nativeSearchQuery = nativeSearchQueryBuilder.build();
	return esProductRepository.search(nativeSearchQuery);
}

5.ElasticsearchRepository中自定义查询

    /**
	 * 根据属性1自定义查询
	 * @param pageNum
	 * @param pageSize
	 * @param attr1
	 * @return
	 */
	public Page<EsProduct> listAttr1(Integer pageNum, Integer pageSize, String attr1) {
		Pageable pageable = PageRequest.of(pageNum, pageSize);
		Page<EsProduct> esProducts = esProductRepository.findByAttr1(attr1, pageable);
		return esProducts;
	}

6.聚合查询

/**
 * 根据attr1聚合查询
 * @return
 */
public EsProduct aggsAttr1() {
	EsProduct esProduct = new EsProduct();
	NativeSearchQueryBuilder nativeSearchQueryBuilder = new NativeSearchQueryBuilder();
	nativeSearchQueryBuilder.addAggregation(AggregationBuilders.terms("aggs_attr1").field("attr1"));
	NativeSearchQuery searchQuery = nativeSearchQueryBuilder.build();
	Map<String, Object> map = new HashMap<>();
	// 执行查询
	// 过elasticsearchTemplate.query()方法查询,获得聚合
	Aggregations aggregations = elasticsearchTemplate.query(searchQuery, response -> response.getAggregations());
	// 转换成Map集合
	Map<String, Aggregation> aggregationMap = aggregations.asMap();
	StringTerms stringTerms = (StringTerms) aggregationMap.get("aggs_attr1");
	List<StringTerms.Bucket> buckets = stringTerms.getBuckets();
	buckets.forEach(bucket -> map.put(bucket.getKeyAsString(),bucket.getDocCount()));
	esProduct.setMap(map);
	return esProduct;
}

7.新增或修改文档

public EsProduct save(EsProduct esProduct) {
	EsProduct save = esProductRepository.save(esProduct);
	return save;
}

8.删除文档

/**
 * 根据id删除文档
 * @param id
 */
public void deleteById(Long id) {
	esProductRepository.deleteById(id);
}
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值