微信公众号搜"智元新知"关注
微信扫一扫可直接关注哦!

ElasticSearch-集成Spring Data Elasticsearch

目录

环境准备

引入依赖

<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,这里的 id 是全局唯一的标识,等同于 es 中的"_id"
    @Id
    private Long id;//商品唯一标识
    /**
     * type : 字段数据类型
     * analyzer : 分词器类型
     * index : 是否索引(认:true)
     * Keyword : 短语,不进行分词
     */
    @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();

查询操作

分页查询

//设置排序(排序方式,正序还是倒序,排序的 id)
Sort sort = Sort.by(Sort.Direction.DESC, "id");
int currentPage = 0;//当前页,第一页从 0 开始,1 表示第二页
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);

版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。

相关推荐