SpringBoot整合ElasticSearch-SpringData

前言

之前写过一篇SpringBoot整合ElasticSearch是使用的elasticsearch-rest-high-level-client,这篇文章使用Spring-Data来操作ElasticSearch。关于ElasticSearch的搭建我这里都不想提了,往期文章都有,各种版本的!这里Spring-Data就是为了简化数据操作的,对于ElasticSearch中的所有,数据都可以转换成对象的操作!

前置环境

POM

	<parent>
        <groupId>org.springframework.boot</groupId>
        <artifactId>spring-boot-starter-parent</artifactId>
        <version>2.3.6.RELEASE</version>
        <relativePath/> <!-- lookup parent from repository -->
    </parent>

		<dependency>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-starter-data-elasticsearch</artifactId>
        </dependency>

注意不同版本的parent具体操作的API不同,2.3.6.RELEAS,使用的ElasticSearch为7.4.2

实体类

/**
 * @author TAO
 * @description: 实体类和索引的Mapping
 * @date 2021/8/28 18:27
 */
@Data
@NoArgsConstructor
@AllArgsConstructor
@ToString
@Document(indexName = "product", shards = 3, replicas = 1)
public class Product {


    @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.Double)
    private Double price;

    @Field(type = FieldType.Keyword, index = false)/*不能分词*/
    private String image;

}

ElasticSearch配置类


/**
* @description: Spring-Data-ElasticSearch
* @author TAO
* @date 2021/8/28 18:43
*/

@ConfigurationProperties(prefix = "elasticsearch")
@Configuration
@Data
public class ElasticSearchConfig extends AbstractElasticsearchConfiguration {

    private String host;

    private Integer port;

    @Override
    public RestHighLevelClient elasticsearchClient() {
        RestClientBuilder builder = RestClient.builder(new HttpHost(host,port));
        RestHighLevelClient restHighLevelClient = new RestHighLevelClient(builder);
        return restHighLevelClient;
    }
}

ElasticsearchRepository

import com.tao.es.estest.entity.Product;
import org.springframework.data.elasticsearch.repository.ElasticsearchRepository;
import org.springframework.stereotype.Repository;

@Repository
public interface ProduceDao extends ElasticsearchRepository<Product,Long> {
}

启动类

@EnableElasticsearchRepositories(basePackages = "com.tao.es.estest.dao")

properties配置

#es服务器地址
elasticsearch.host=192.168.1.12
elasticsearch.port=9200


索引测试


@Slf4j
@SpringBootTest
class EsTestSpringData {

    @Autowired
    private ElasticsearchRestTemplate elasticsearchRestTemplate;

    @Test
    public void createIndex(){
        log.info("创建索引");
    }


    @Test
    public void deleteIndex(){
        boolean b = elasticsearchRestTemplate.deleteIndex(Product.class);
        log.info("删除===>{}",b);
    }

}

在这里插入图片描述

文档测试

	//保存
    @Test
    public void save(){
        Product product = new Product().setId(1L).setTitle("华为手机天下第一").setCategory("手机").setPrice(9999.99).setImage("http://baidu.com/image.png");
        produceDao.save(product);
    }

在这里插入图片描述

   //更新
    @Test
    public void update(){
        Product product = new Product().setId(1L).setTitle("华为手机天下第一,非常牛逼").setCategory("手机").setPrice(9999.99).setImage("http://baidu.com/image.png");
        produceDao.save(product);
    }

在这里插入图片描述

 	//根据id查询数据
    @Test
    public void findById(){
        Product product = produceDao.findById(1L).get();
        log.info("product===>{}",product);
    }

在这里插入图片描述

	 //查询所有
    /**
     * findAll此API对elasticsearch-rest-high-level-client的版本有要求,
     * 如果POM中还单独引用了elasticsearch-rest-high-level-client并指定了其他版本可能会不兼容
     * 这里elasticsearch-rest-high-level-client版本为7.6.2时下面API是可以运行的
     */
    @Test
    public void findAll(){
        Iterable<Product> all = produceDao.findAll();

        for (Product product:all){
            log.info("product===>{}",product);
        }

    }

在这里插入图片描述
在这里插入图片描述
说明一下,我个项目并不是一个干净的Spring-Data整合ElasticSearch的项目,而是之前整合elasticsearch-rest-high-level-client的时候使用的,这里也能反映一点Spring-Data整合ElasticSearch,实际上通过Maven依赖可以看出底层还是使用的是elasticsearch-rest-high-level-client来操作ELasticSearch的,只不过又在elasticsearch-rest-high-level-client的基础上封装了一层,其实我本人是不喜欢使用过度封装的东西,比较喜欢使用elasticsearch-rest-high-level-client更加灵活,就如操作Redis我比较喜欢使用jedis来操作!

	//根据id删除数据
    @Test
    public void deleteById(){
        Product product = new Product().setId(1L);
        produceDao.delete(product);
    }

在这里插入图片描述

  //批量保存
    @Test
    public void batchSave(){
        List<Product> productList = new ArrayList<>();
        for (int i = 0; i < 10; i++) {
            Product product = new Product().setId(Long.valueOf(i)).setTitle("华为手机天下第一"+i).setCategory("手机").setPrice(9999.99*i).setImage("http://baidu.com/image.png");
            productList.add(product);
        }
        produceDao.saveAll(productList);
    }

在这里插入图片描述

	//分页查询
    @Test
    public void pageQuery(){

        //构建排序
        Sort sort = Sort.by(Sort.Direction.DESC, "id");

        int from = 0;
        int size = 5;

        //设置查询分页
        PageRequest pageRequest = PageRequest.of(from, size,sort);


        Page<Product> all = produceDao.findAll(pageRequest);
        for (Product product:all){
            log.info("product===>{}",product);
        }

    }

在这里插入图片描述

	 //term查询
    @Test
    public void termQuery(){
        TermQueryBuilder termQueryBuilder = QueryBuilders.termQuery("category", "手机");
        Iterable<Product> all = produceDao.search(termQueryBuilder);
        for (Product product:all){
            log.info("product===>{}",product);
        }
    }
	//term分页查询
    @Test
    public void termPageQuery(){

        int from = 0;
        int size = 5;

        //设置查询分页
        PageRequest pageRequest = PageRequest.of(from, size);


        TermQueryBuilder termQueryBuilder = QueryBuilders.termQuery("category", "手机");
        Iterable<Product> all = produceDao.search(termQueryBuilder,pageRequest);
        for (Product product:all){
            log.info("product===>{}",product);
        }
    }
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

程序员劝退师-TAO

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值