**1. 封装一个实体类**
```java
@Data
@Builder
@NoArgsConstructor
@AllArgsConstructor
@Document(indexName = "product", shards = 3, replicas = 1)
public class Product {
/** 产品唯一标识 */
@Id
private Long id;
/** 产品名称 */
@Field(type = FieldType.Text)
private String title;
/** 产品品牌 */
@Field(type = FieldType.Keyword)
private String brand;
/** 产品价格 */
@Field(type = FieldType.Double)
private Double price;
/** 产品图片地址 */
@Field(type = FieldType.Text, index = false)
private String images;
}
```
**2. 继承接口ElasticsearchRepository**
```java
/**
* 继承接口ElasticsearchRepository<实体类, 实体类中的ID类型>,便可以调用接口的
* 方法与Elasticsearch交互了。
*
* 在接口中声明的方法的方法名是有一定规律的,
* 查询以 find开始、新增和更新以save开始、删除以delete开始、统计以count开始、存在exists开始。
* 声明一个方法按照从左到右编写的话,IDEA是可以给出参考的方法名的。
*/
@Repository
public interface ProductDao extends ElasticsearchRepository<Product, Long> {
/** 根据产品名称查询产品 */
List<Product> findByTitle(String title);
/** 查询价格在[price1, price2]之间的产品 */
List<Product> findByPriceBetween(double price1, double price2);
/** 根据品牌查询 */
List<Product> findByBrand(String brand);
/** 根据品牌查询,然后按照价格降序排序 */
List<Product> findByBrandOrderByPriceDesc(String brand);
/** 根据品牌与价格区间查询 */
List<Product> findByBrandAndPriceBetween(String brand, double price1, double price2);
}
```
更过命名规则参考官方文档:https://docs.spring.io/spring-data/elasticsearch/docs/4.2.6/reference/html/#elasticsearch.query-methods.criterions
**3. 调用接口中的方法**
```java
@RunWith(SpringRunner.class)
@SpringBootTest(classes = {SpringDataEsApplication.class})
public class ProductControllerTest {
@Autowired
private ProductDao productDao;
/**
* 新增或更新。
* 新增与更新都是调用save方法,没有该条数据时是新增,已经有了就是更新。
*/
@Test
public void saveDocument() {
Product product = Product.builder()
.id(1001L)
.title("华为 Mate 40 Pro 4G版")
.brand("华为")
.price(5899.0d)
.images("https://res.xx455CB694209CB8A2mp.png")
.build();
Product result = productDao.save(product);
}
/**
* 删除文档。
*/
@Test
public void deleteDocument() {
Product product = Product.builder().id(1001L).build();
productDao.delete(product);
}
/**
* 批量新增文档。//调用deleteAll便可实现批量删除
*/
@Test
public void saveAll() {
List<Product> products = new ArrayList<>();
products.add(new Product(1001L, "华为 Mate 30 Pro 4G版", "华为", 1000.0d, "http://1.jpg"));
products.add(new Product(1002L, "华为 Mate 40 Pro 4G版", "华为", 2000.0d, "http://2.jpg"));
products.add(new Product(1003L, "华为 Mate 50 Pro 4G版", "华为", 3000.0d, "http://3.jpg"));
Iterable<Product> iterable = productDao.saveAll(products);
}
/**
* 查询所有。
* 根据id字段升序排序
*/
@Test
public void findAll() {
Iterable<Product> iterable = productDao.findAll(Sort.by(Sort.Direction.ASC, "id"));
iterable.forEach(product -> {
System.out.println(product.toString());
});
//Product(id=1001, title=华为 Mate 30 Pro 4G版, brand=华为, price=1000.0, images=http://1.jpg)
//Product(id=1002, title=华为 Mate 40 Pro 4G版, brand=华为, price=2000.0, images=http://2.jpg)
//Product(id=1003, title=华为 Mate 50 Pro 4G版, brand=华为, price=3000.0, images=http://3.jpg)
}
/**
* 根据id查询产品
*/
@Test
public void findById() {
Product product = Product.builder().id(1001L).build();
Product result = productDao.findById(product.getId()).get();
System.out.println(result);
//Product(id=1001, title=华为 Mate 30 Pro 4G版, brand=华为, price=1000.0, images=http://1.jpg)
}
/**
* 按照产品名称查询。
*/
@Test
public void findByTitle() {
List<Product> products = productDao.findByTitle("华为 Mate 30 Pro 4G版");
products.forEach(System.out::println);
//Product(id=1001, title=华为 Mate 30 Pro 4G版, brand=华为, price=1000.0, images=http://1.jpg)
}
/**
* 按照价格区间查询。
*/
@Test
public void findByPriceBetween() {
List<Product> products = productDao.findByPriceBetween(1000, 3000);
products.forEach(System.out::println);
//Product(id=1002, title=华为 Mate 40 Pro 4G版, brand=华为, price=2000.0, images=http://2.jpg)
//Product(id=1003, title=华为 Mate 50 Pro 4G版, brand=华为, price=3000.0, images=http://3.jpg)
//Product(id=1001, title=华为 Mate 30 Pro 4G版, brand=华为, price=1000.0, images=http://1.jpg)
}
/**
* 按照品牌查询。
*/
@Test
public void findByBrand() {
List<Product> products = productDao.findByBrand("华为");
products.forEach(System.out::println);
//Product(id=1002, title=华为 Mate 40 Pro 4G版, brand=华为, price=2000.0, images=http://2.jpg)
//Product(id=1003, title=华为 Mate 50 Pro 4G版, brand=华为, price=3000.0, images=http://3.jpg)
//Product(id=1001, title=华为 Mate 30 Pro 4G版, brand=华为, price=1000.0, images=http://1.jpg)
}
/**
*按照品牌查询,然后按照价格降序排序
*/
@Test
public void findByBrandOrderByPriceDesc() {
List<Product> products = productDao.findByBrandOrderByPriceDesc("华为");
products.forEach(System.out::println);
//Product(id=1003, title=华为 Mate 50 Pro 4G版, brand=华为, price=3000.0, images=http://3.jpg)
//Product(id=1002, title=华为 Mate 40 Pro 4G版, brand=华为, price=2000.0, images=http://2.jpg)
//Product(id=1001, title=华为 Mate 30 Pro 4G版, brand=华为, price=1000.0, images=http://1.jpg)
}
/**
* 根据品牌与价格区间查询。
*/
@Test
public void findByBrandAndPriceBetween() {
List<Product> products = productDao.findByBrandAndPriceBetween("华为", 2000, 3000);
products.forEach(System.out::println);
//Product(id=1002, title=华为 Mate 40 Pro 4G版, brand=华为, price=2000.0, images=http://2.jpg)
//Product(id=1003, title=华为 Mate 50 Pro 4G版, brand=华为, price=3000.0, images=http://3.jpg)
}
/**
* 分页查询
*/
@Test
public void findByPageable() {
//根据价格降序排序
Sort sort = Sort.by(Sort.Direction.DESC, "price");
int currentPage = 0; //从第0页开始
int pageSize = 2; //每一页显示2条数据
PageRequest request = PageRequest.of(currentPage, pageSize, sort);
Page<Product> products = productDao.findAll(request);
products.forEach(System.out::println);
//Product(id=1003, title=华为 Mate 50 Pro 4G版, brand=华为, price=3000.0, images=http://3.jpg)
//Product(id=1002, title=华为 Mate 40 Pro 4G版, brand=华为, price=2000.0, images=http://2.jpg)
}
}
```
- Elasticsearch是什么
- 全文搜索引擎
- Elasticsearch与Solr
- 数据结构
- 安装Elasticsearch
- Linux单机安装
- Windows单机安装
- 安装Kibana
- Linux安装
- Windows安装
- es基本语句
- 索引操作
- 文档操作
- 映射操作
- 高级查询
- es-JavaAPI
- maven依赖
- 索引操作
- 文档操作
- 高级查询
- es集群搭建
- Linux集群搭建
- Windows集群搭建
- 核心概念
- 索引(Index)
- 类型(Type)
- 文档(Document)
- 字段(Field)
- 映射(Mapping)
- 分片(Shards)
- 副本(Replicas)
- 分配(Allocation)
- 系统架构
- 分布式集群
- 单节点集群
- 故障转移
- 水平扩容
- 应对故障
- 路由计算
- 分片控制
- 写流程
- 读流程
- 更新流程
- 多文档操作流程
- 分片原理
- 倒排索引
- 文档搜索
- 动态更新索引
- 近实时搜索
- 持久化变更
- 段合并
- 文档分析
- 内置分析器
- 分析器使用场景
- 测试分析器
- 指定分析器
- 自定义分析器
- 文档处理
- 文档冲突
- 乐观并发控制
- 外部系统版本控制
- es优化
- 硬件选择
- 分片策略
- 合理设置分片数
- 推迟分片分配
- 路由选择
- 写入速度优化
- 批量数据提交
- 优化存储设备
- 合理使用合并
- 减少Refresh的次数
- 加大Flush设置
- 减少副本的数量
- 内存设置
- 重要配置
- es常见问题
- 为什么要使用Elasticsearch
- master选举流程
- 集群脑裂问题
- 索引文档流程
- 更新和删除文档流程
- 搜索流程
- ES部署在Linux时的优化方法
- GC方面ES需要注意的点
- ES对大数据量的聚合实现
- 并发时保证读写一致性
- 字典树
- ES的倒排索引
- Spring Data Elasticsearch
- 环境搭建
- 索引操作
- 文档操作