使用ElasticsearchRepository和ElasticsearchRestTemplate操作Elasticsearch,Spring Boot整合Elasticsearch

提示:文章写完后,目录可以自动生成,如何生成可参考右边的帮助文档


前言

Elasticsearch官网参考文档:https://www.elastic.co/guide/index.html
Elasticsearch官方下载地址:https://www.elastic.co/cn/downloads/elasticsearch
https://docs.spring.io/spring-data/elasticsearch/reference/

添加依赖

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

修改yml配置文件

server:
  port: 8082
spring:
  elasticsearch:
    rest:
      uris: 192.168.25.131:9200 #集群 后面加 , 


一、实体类

@Data
@AllArgsConstructor
@NoArgsConstructor
//indexName 索引库名称 名字如果是字母那么必须是小写字母
//createIndex 是否创建索引
@Document(indexName = "student",createIndex = true)
public class Student {

    @Id
    @Field(store = true, type = FieldType.Keyword)
    private String sId;

    @Field(store = true, type = FieldType.Keyword)
    private String sName;

    @Field(store = true, type = FieldType.Text, analyzer = "ik_smart")
    //Text可以分词 ik_smart=粗粒度分词 ik_max_word 为细粒度分词
    private String sAddress;

    @Field(index = false, store = true, type = FieldType.Integer)
    private Integer sAge;

    @Field(index = false, store = true, type = FieldType.Date, format = DateFormat.basic_date_time)
    private Date sCreateTime;

    @Field(type = FieldType.Keyword)
    private String[] sCourseList; //数组类型 由数组中第一个非空值决定(这里数组和集合一个意思了)

    @Field(type = FieldType.Keyword)
    private List<String> sColorList; //集合类型 由数组中第一个非空值决定

}

二、继承ElasticsearchRepository类

public interface EsStudentRepository extends ElasticsearchRepository<McMesgPushRecDetailVO, String> {
    /**
     * 自定义查询方法,方法名需要遵循【自定义方法命名约定】
     * @param sName
     * @param sAddress
     * @return
     */
    List<Student> findBySNameOrSAddress(String sName, String sAddress);

}

【自定义方法命名约定】:

在这里插入图片描述

二、ElasticsearchRepository和ElasticsearchRestTemplate使用步骤

1.接口类

代码如下(示例):

public interface EsStudentService {

    /**
     * 保存到ES中
     * @param Student
     */
    public void save(Student student);

    /**
     * 根据消息内容或手机号查询ES中的结果
     * @param messageContents
     * @param contactContents
     * @return
     */
    public List<Student> findBySNameOrSAddress(String sName, String sAddress);

    /**
     * 批量添加或更新文档
     * @param list
     */
    public void saveOrUpdate(List<Student> list);

    /**
     * 查询
     * @param param value
     * @return
     */
    public List<Student> query(String param,String value,Page page);
}

2.实现方法

@Service
public class EsStudentServiceImpl implements EsStudentService {

    @Resource
    private EsStudentRepository studentRepository;

    /**
     * spring容器已存在此bean实例,直接注入即可
     */
    @Resource
    private ElasticsearchRestTemplate elasticsearchRestTemplate;


    /**
     * 保存消息详情到ES中
     * @param detailVO
     */
    @Override
    public void save(Student student) {
    	//ElasticsearchRepository封装好的方法,还有更多其他封装好的方法
        studentRepository.save(student);
    }

    /**
     * 从ES中查询结果
     * @param sName
     * @param sAddress
     * @return
     */
    @Override
    public List<student> findBySNameOrSAddress(String messageContents, String contactContents) {
    	//自定义查询方法
        return studentRepository.findBySNameOrSAddress(String sName, String sAddress);
    }

    /**
     * 批量保存或更新
     * @param list
     */
    @Override
    public void saveOrUpdate(List<Student> list){
        if (!CollectionUtils.isEmpty(list)){
            List<IndexQuery> indexQueries = new ArrayList<>();
            for (Student student : list){
                IndexQuery indexQuery = new IndexQuery();
                indexQuery.setObject(student );
                indexQueries.add(indexQuery);
            }
            elasticsearchRestTemplate.bulkIndex(indexQueries, IndexCoordinates.of("student"));
        }
    }

    /**
     * 查询 分页
     * @param param
     * @return
     */
    @Override
    public List<Student> query(String param, String value, Page page){
        List<Student> list = new ArrayList<>();
        BoolQueryBuilder queryBuilder = new BoolQueryBuilder();
        List<String> params = Arrays.asList(param.split(";"));
        for (String queryColumn : params){
            queryBuilder.must(QueryBuilders.fuzzyQuery(queryColumn, value));
        }
        queryBuilder.filter();
        NativeSearchQuery query = new NativeSearchQueryBuilder()
                //过滤
                .withQuery(queryBuilder)
                //分页
                .withPageable(PageRequest.of(page.getPageNumber(), page.getPageSize()))
                .build();
        SearchHits<Student> search = elasticsearchRestTemplate.search(query, Student.class);
        if(search.getTotalHits()>0){
            search.forEach(userSearchHit ->{
                list.add(userSearchHit.getContent());
            });
        }
        return list;
    }
}

3.接口测试

	/**
	* 注入
	**/
    @Resource
    private EsStudentService esStudentService;
    //ElasticsearchRepository
     @RequestMapping("/esTest")
    public String esTest(@RequestBody Student student){
    esStudentService.save(vo);
        return "res";
    }
	//ElasticsearchRepository
    @RequestMapping("/esTest2")
    public String esTest(@RequestParam String sName){
        List<McMesgPushRecDetailVO> list = 	esStudentService.findBySNameOrSAddress(messageContents,null);
        return JSONArray.toJSONString(list);
    }
    //ElasticsearchRestTemplate
    @RequestMapping("/esTest3")
    public String esTest3(@RequestParam String sName){
        Page page = new Page();
        page.setPageNumber(1);
        page.setPageSize(10);
        List<Student> list = esStudentService.query("sName",sName,page);
        return JSONArray.toJSONString(list);
    }
     //ElasticsearchRestTemplate
    @RequestMapping("/esTest4")
    public String esTest4(@RequestBody Student student){
        List<Student> list = new ArrayList<>();
        list.add(vo);
        esMcMesgPushRecDetailService.saveOrUpdate(list);
        return "res";
    }

总结

如果注入失败ElasticsearchRepository:

1.@EnableElasticsearchRepositories 添加此注解扫描Repository
2.检查自定义方法是否符合约束

  • 8
    点赞
  • 14
    收藏
    觉得还不错? 一键收藏
  • 1
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值