博客
关于我
商城-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 权限登录问题:ERROR 1045 (28000): Access denied for user ‘root‘@‘localhost‘ (using password: YES)
查看>>
MYSQL 查看最大连接数和修改最大连接数
查看>>
MySQL 查看有哪些表
查看>>
mysql 查看锁_阿里/美团/字节面试官必问的Mysql锁机制,你真的明白吗
查看>>
MySql 查询以逗号分隔的字符串的方法(正则)
查看>>
MySQL 查询优化:提速查询效率的13大秘籍(避免使用SELECT 、分页查询的优化、合理使用连接、子查询的优化)(上)
查看>>
mysql 查询数据库所有表的字段信息
查看>>
【Java基础】什么是面向对象?
查看>>
mysql 查询,正数降序排序,负数升序排序
查看>>
MySQL 树形结构 根据指定节点 获取其下属的所有子节点(包含路径上的枝干节点和叶子节点)...
查看>>
mysql 死锁 Deadlock found when trying to get lock; try restarting transaction
查看>>
mysql 死锁(先delete 后insert)日志分析
查看>>
MySQL 死锁了,怎么办?
查看>>
MySQL 深度分页性能急剧下降,该如何优化?
查看>>
MySQL 深度分页性能急剧下降,该如何优化?
查看>>
MySQL 添加列,修改列,删除列
查看>>
mysql 添加索引
查看>>
MySQL 添加索引,删除索引及其用法
查看>>