环境准备
引入依赖
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-data-elasticsearch</artifactId>
<version>2.2.1.RELEASE</version>
</dependency>
编写配置文件
# es 服务地址
elasticsearch.host=192.168.80.10
# es 服务端口
elasticsearch.port=9200
# 配置日志级别,开启 debug 日志
logging.level.com.atguigu.es=debug
编写配置类
- ElasticsearchRestTemplate 是 spring-data-elasticsearch 项目中的一个类,和其他 spring 项目中的 template类似。
- 在新版的 spring-data-elasticsearch 中,ElasticsearchRestTemplate 代替了原来的 ElasticsearchTemplate。
- 原因是 ElasticsearchTemplate 基于 TransportClient,TransportClient 即将在 8.x 以后的版本中移除。所以,推荐使用 ElasticsearchRestTemplate。
- ElasticsearchRestTemplate 基 于 RestHighLevelClient 客户端的。需要自定义配置类,继承AbstractElasticsearchConfiguration,并实现 elasticsearchClient()抽象方法,创建 RestHighLevelClient 对象。
@Configuration
public class ElasticsearchConfig extends AbstractElasticsearchConfiguration {
@Value("${elasticsearch.host}")
private String host;
@Value("${elasticsearch.port}")
private Integer port;
@Override
public RestHighLevelClient elasticsearchClient() {
RestClientBuilder builder = RestClient.builder(new HttpHost(host, port));
RestHighLevelClient restHighLevelClient = new
RestHighLevelClient(builder);
return restHighLevelClient;
}
}
创建实体类映射操作
@Data
@NoArgsConstructor
@AllArgsConstructor
@Document(indexName = "shopping")
public class ProductES {
@Id
private Long id;
@Field(type = FieldType.Text)
private String title;
@Field(type = FieldType.Keyword)
private String category;
@Field(type = FieldType.Double)
private Double price;
@Field(type = FieldType.Keyword, index = false)
private String images;
}
创建DAO数据访问对象
@Repository
public interface ProductDao extends ElasticsearchRepository<ProductES, Long> {
}
注入依赖
@Autowired
private ElasticsearchRestTemplate esTemplate;
@Autowired
private ProductDao productDao;
索引操作
添加索引
esTemplate.createIndex(ProductES.class);
删除索引
esTemplate.deleteIndex(ProductES.class);
文档操作
添加文档
ProductES product = new ProductES();
product.setId(2L);
product.setTitle("华为手机");
product.setCategory("手机");
product.setPrice(2999.0);
product.setImages("https://blog.csdn.net/xiaoyixiao_?spm=1001.2014.3001.5343");
productDao.save(product);
批量添加文档
List<ProductES> productList = new ArrayList<>();
for (int i = 0; i < 10; i++) {
ProductES product = new ProductES();
product.setId(Long.valueOf(i));
product.setTitle("[" + i + "]小米手机");
product.setCategory("手机");
product.setPrice(1999.0 + i);
product.setImages("https://blog.csdn.net/xiaoyixiao_?spm=1001.2014.3001.5343");
productList.add(product);
}
productDao.saveAll(productList);
修改文档
ProductES product = new ProductES();
product.setId(2L);
product.setTitle("小米手机");
product.setCategory("手机");
product.setPrice(2999.0);
product.setImages("https://blog.csdn.net/xiaoyixiao_?spm=1001.2014.3001.5343");
productDao.save(product);
删除文档
ProductES product = new ProductES();
product.setId(2L);
productDao.delete(product);
通过ID查找文档
ProductES productES = productDao.findById(2L).get();
查询全部文档
Iterable<ProductES> products = productDao.findAll();
查询操作
分页查询
Sort sort = Sort.by(Sort.Direction.DESC, "id");
int currentPage = 0;
int pageSize = 5;
PageRequest pageRequest = PageRequest.of(currentPage, pageSize, sort);
Page<ProductES> productPage = productDao.findAll(pageRequest);
匹配查询
TermQueryBuilder termQuery = QueryBuilders.termQuery("title", "小米");
Iterable<ProductES> products = productDao.search(termQuery);
匹配分页查询
int currentPage = 0;
int pageSize = 5;
PageRequest pageRequest = PageRequest.of(currentPage, pageSize);
TermQueryBuilder termQuery = QueryBuilders.termQuery("title", "小米");
Iterable<ProductES> products = productDao.search(termQuery, pageRequest);