博客
关于我
商城-Elasticsearch-Spring Data Elasticsearch
阅读量:469 次
发布时间:2019-03-06

本文共 5377 字,大约阅读时间需要 17 分钟。

Spring Data Elasticsearch 开发指南

1. 概述

Spring Data Elasticsearch 是 Spring Data 项目的一个重要模块,旨在为 Elasticsearch 提供一套与 Spring 框架无缝集成的解决方案。它简化了与 Elasticsearch 的交互,提升了开发效率,同时保留了 Elasticsearch 的灵活性和强大功能。


2. 创建示例项目

2.1 项目依赖

在 pom.xml 中添加必要的依赖:

org.springframework.boot
spring-boot-starter-data-elasticsearch

2.2 应用配置

在 application.yml 中配置 Elasticsearch 连接信息:

spring:
data:
elasticsearch:
cluster-name: elasticsearch
cluster-nodes: 192.168.56.101:9300

3. 实体类与注解

3.1 实体类定义

定义一个简单的 Item 实体类,并添加必要的注解:

@Entity
@Document(indexName = "item", type = "docs", shards = 1, replicas = 0)
public class Item {
@Id
private Long id;
@Field(type = FieldType.Text, analyzer = "ik_max_word")
private String title;
@Field(type = FieldType.Keyword)
private String category;
@Field(type = FieldType.Keyword)
private String brand;
@Field(type = FieldType.Double)
private Double price;
@Field(index = false, type = FieldType.Keyword)
private String images;
}

3.2 注解说明

  • @Document:标记实体类为 Elasticsearch 文档对象,配置索引名称、类型等属性。
  • @Id:标记字段为主键。
  • @Field:定义字段的映射属性,包括字段类型、索引设置等。

4. Elasticsearch 操作

4.1 创建索引

使用 ElasticsearchTemplate 创建索引并自动映射实体类:

@RunWith(SpringRunner.class)
@SpringBootTest(classes = ItcastElasticsearchApplication.class)
public class IndexTest {
@Autowired
private ElasticsearchTemplate elasticsearchTemplate;
@Test
public void testCreate() {
elasticsearchTemplate.createIndex(Item.class);
elasticsearchTemplate.putMapping(Item.class);
}
}

4.2 删除索引

@Test
public void deleteIndex() {
elasticsearchTemplate.deleteIndex("heima");
}

5. Repository 操作

5.1 自动化 Repository

定义一个接口,继承 ElasticsearchRepository

public interface ItemRepository extends ElasticsearchRepository
{}

5.2 文档操作

5.2.1 新增文档

@Autowired
private ItemRepository itemRepository;
@Test
public void index() {
Item item = new Item(1L, "小米手机7", "手机", "小米", 3499.00, "http://image.leyou.com/13123.jpg");
itemRepository.save(item);
}

5.2.2 批量新增

@Test
public void indexList() {
List
list = new ArrayList<>();
list.add(new Item(2L, "坚果手机R1", "手机", "锤子", 3699.00, "http://image.leyou.com/13123.jpg"));
list.add(new Item(3L, "华为META10", "手机", "华为", 4499.00, "http://image.leyou.com/3.jpg"));
itemRepository.saveAll(list);
}

6. 查询与聚合

6.1 基本查询

6.1.1 全部查询

@Test
public void testFind() {
Iterable
items = itemRepository.findAll(Sort.by(Sort.Direction.DESC, "price"));
items.forEach(item -> System.out.println(item));
}

6.1.2 按价格排序

@Test
public void testSort() {
Page
items = itemRepository.search(
new NativeSearchQueryBuilder()
.withQuery(QueryBuilders.termQuery("category", "手机"))
.withSort(SortBuilders.fieldSort("price").order(SortOrder.DESC))
.build()
);
items.forEach(System.out::println);
}

7. 高级查询

7.1 自定义查询

7.1.1 模糊查询

@Test
public void testNativeQuery() {
NativeSearchQueryBuilder queryBuilder = new NativeSearchQueryBuilder();
queryBuilder.withQuery(QueryBuilders.matchQuery("title", "小米"));
Page
items = itemRepository.search(queryBuilder.build());
System.out.println(items.getTotalElements());
items.forEach(System.out::println);
}

7.1.2 分页查询

@Test
public void testPageQuery() {
NativeSearchQueryBuilder queryBuilder = new NativeSearchQueryBuilder();
queryBuilder.withPageable(PageRequest.of(0, 3));
queryBuilder.withQuery(QueryBuilders.termQuery("category", "手机"));
Page
items = itemRepository.search(queryBuilder.build());
System.out.println(items.getTotalElements());
System.out.println(items.getTotalPages());
items.forEach(System.out::println);
}

8. 聚合操作

8.1 桶聚合

8.1.1 按品牌分组

@Test
public void testAgg() {
NativeSearchQueryBuilder queryBuilder = new NativeSearchQueryBuilder();
queryBuilder.withSourceFilter(new FetchSourceFilter(new String[]{""}, null));
queryBuilder.addAggregation(
AggregationBuilders.terms("brands").field("brand")
);
AggregatedPage
aggPage = itemRepository.search(queryBuilder.build());
StringTerms agg = (StringTerms) aggPage.getAggregation("brands");
List
buckets = agg.getBuckets();
for (StringTerms.Bucket bucket : buckets) {
System.out.println(bucket.getKeyAsString() + ",共" + bucket.getDocCount() + "台");
}
}

8.2 嵌套聚合

8.2.1 计算每个品牌的平均价格

@Test
public void testSubAgg() {
NativeSearchQueryBuilder queryBuilder = new NativeSearchQueryBuilder();
queryBuilder.withSourceFilter(new FetchSourceFilter(new String[]{""}, null));
queryBuilder.addAggregation(
AggregationBuilders.terms("brands").field("brand")
.subAggregation(AggregationBuilders.avg("priceAvg").field("price"))
);
AggregatedPage
aggPage = itemRepository.search(queryBuilder.build());
StringTerms agg = (StringTerms) aggPage.getAggregation("brands");
List
buckets = agg.getBuckets();
for (StringTerms.Bucket bucket : buckets) {
System.out.println(bucket.getKeyAsString() + ",共" + bucket.getDocCount() + "台");
InternalAvg avg = (InternalAvg) bucket.getAggregations().asMap().get("priceAvg");
System.out.println("平均售价:" + avg.getValue());
}
}

以上内容涵盖了 Spring Data Elasticsearch 的核心功能,包括索引操作、文档存储与查询、聚合等高级功能,适合开发者快速入门和实际应用。

转载地址:http://mnxbz.baihongyu.com/

你可能感兴趣的文章
mysql 主键重复则覆盖_数据库主键不能重复
查看>>
Mysql 事务知识点与优化建议
查看>>
Mysql 优化 or
查看>>
mysql 优化器 key_mysql – 选择*和查询优化器
查看>>
MySQL 优化:Explain 执行计划详解
查看>>
Mysql 会导致锁表的语法
查看>>
mysql 使用sql文件恢复数据库
查看>>
mysql 修改默认字符集为utf8
查看>>
Mysql 共享锁
查看>>
MySQL 内核深度优化
查看>>
mysql 内连接、自然连接、外连接的区别
查看>>
mysql 写入慢优化
查看>>
mysql 分组统计SQL语句
查看>>
Mysql 分页
查看>>
Mysql 分页语句 Limit原理
查看>>
MySql 创建函数 Error Code : 1418
查看>>
MySQL 创建新用户及授予权限的完整流程
查看>>
mysql 创建表,不能包含关键字values 以及 表id自增问题
查看>>
mysql 删除日志文件详解
查看>>
mysql 判断表字段是否存在,然后修改
查看>>