博客
关于我
商城-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 replace用法
查看>>
Mysql Row_Format 参数讲解
查看>>
mysql select, from ,join ,on ,where groupby,having ,order by limit的执行顺序和书写顺序
查看>>
MySQL Server 5.5安装记录
查看>>
mysql server has gone away
查看>>
mysql slave 停了_slave 停止。求解决方法
查看>>
MySQL SQL 优化指南:主键、ORDER BY、GROUP BY 和 UPDATE 优化详解
查看>>
MYSQL sql语句针对数据记录时间范围查询的效率对比
查看>>
mysql sum 没返回,如果没有找到任何值,我如何在MySQL中获得SUM函数以返回'0'?
查看>>
mysql Timestamp时间隔了8小时
查看>>
Mysql tinyint(1)与tinyint(4)的区别
查看>>
mysql union orderby 无效
查看>>
mysql v$session_Oracle 进程查看v$session
查看>>
mysql where中如何判断不为空
查看>>
MySQL Workbench 使用手册:从入门到精通
查看>>
mysql workbench6.3.5_MySQL Workbench
查看>>
MySQL Workbench安装教程以及菜单汉化
查看>>
MySQL Xtrabackup 安装、备份、恢复
查看>>
mysql [Err] 1436 - Thread stack overrun: 129464 bytes used of a 286720 byte stack, and 160000 bytes
查看>>
MySQL _ MySQL常用操作
查看>>