博客
关于我
商城-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/

你可能感兴趣的文章
MTCNN 人脸检测
查看>>
MyEcplise中SpringBoot怎样定制启动banner?
查看>>
MyPython
查看>>
MTD技术介绍
查看>>
MySQL
查看>>
MySQL
查看>>
mysql
查看>>
MTK Android 如何获取系统权限
查看>>
MySQL - 4种基本索引、聚簇索引和非聚索引、索引失效情况、SQL 优化
查看>>
MySQL - ERROR 1406
查看>>
mysql - 视图
查看>>
MySQL - 解读MySQL事务与锁机制
查看>>
MTTR、MTBF、MTTF的大白话理解
查看>>
mt_rand
查看>>
mysql -存储过程
查看>>
mysql /*! 50100 ... */ 条件编译
查看>>
mudbox卸载/完美解决安装失败/如何彻底卸载清除干净mudbox各种残留注册表和文件的方法...
查看>>
mysql 1264_关于mysql 出现 1264 Out of range value for column 错误的解决办法
查看>>
mysql 1593_Linux高可用(HA)之MySQL主从复制中出现1593错误码的低级错误
查看>>
mysql 5.6 修改端口_mysql5.6.24怎么修改端口号
查看>>