千家信息网

Springboot如何集成Elasticsearch

发表于:2025-02-01 作者:千家信息网编辑
千家信息网最后更新 2025年02月01日,小编给大家分享一下Springboot如何集成Elasticsearch,相信大部分人都还不怎么了解,因此分享这篇文章给大家参考一下,希望大家阅读完这篇文章后大有收获,下面让我们一起去了解一下吧!集成
千家信息网最后更新 2025年02月01日Springboot如何集成Elasticsearch

小编给大家分享一下Springboot如何集成Elasticsearch,相信大部分人都还不怎么了解,因此分享这篇文章给大家参考一下,希望大家阅读完这篇文章后大有收获,下面让我们一起去了解一下吧!

    集成配置步骤

    步骤1:加入 Maven 相关依赖

        org.springframework.boot    spring-boot-starter-parent    2.5.7                     org.springframework.boot        spring-boot-starter                    org.springframework.boot        spring-boot-starter-web                    org.springframework.boot        spring-boot-starter-data-elasticsearch                    org.projectlombok        lombok        true    

    步骤2:配置 elasticsearch 的主机和端口

    elasticsearch:  host: 127.0.0.1  port: 9200

    步骤3:配置 Elaseticsearch 客户端

    @Data@Configuration@ConfigurationProperties(prefix = "elasticsearch")public class ElasticSearchConfig extends AbstractElasticsearchConfiguration {     private String host;    private Integer port;     @Override    public RestHighLevelClient elasticsearchClient() {        return new RestHighLevelClient(RestClient.builder(new HttpHost(host, port)));    } }

    步骤4:创建文档实体

    @Data@Document(indexName = "users")public class User {     @Id    @Field(type = FieldType.Long)    private Long id;     @Field(type = FieldType.Text)    private String name;     @Field(type = FieldType.Keyword)    private String sex;     @Field(type = FieldType.Integer)    private Integer age;     @Field(type = FieldType.Text)    private String address; }

    步骤5:创建 controller,service, dao 层

    (5.1)contrller 层

    @RestController@RequestMapping("/user")public class UserController {     @Autowired    private UserService userService; }

    (5.2)service 层

    public interface UserService { }

    (5.3)service 实现层(UserDao 见 5.4)

    @Servicepublic class UserServiceImpl implements UserService {     @Autowired    private UserDao userDao; }

    (5.4)dao 层

    @Repositorypublic interface UserDao extends ElasticsearchRepository { }

    整个相关类创建完成后,项目结构应该如下图所示:

    相关功能实现

    这里以实际功能举例,并列出 controller 和 service 层的实现类写法作为参考。

    主流的一些功能,ES 已经给你封装,默认给与了支持(如:示例1-6),这些相关的实现不需要我们再写 dao 层,但一些较为业务性的查询,还需要自己手动来写。

    1. 添加文档

    controller 层:

    @PostMapping("/save")public String save(@RequestBody User user) {    long id = System.currentTimeMillis();    user.setId(id);    userService.save(user);    return "新增成功,id为:" + id;}

    service 层:

    @Overridepublic Long save(User user) {    userDao.save(user);    return user.getId();}

    测试效果:

    2. 修改文档

    【注】新增文档和修改文档操作,dao 层都是调用的 save() 方法,当 id 不存在的时候,ES(ElasticSearch)就会执行新增操作,当 id 对象已经存在的时候,就会执行修改操作。

    controller 层:

    @PostMapping("/update")public String update(@RequestBody User user) {    userService.save(user);    return "修改成功";}

    service 层:

    @Overridepublic Long save(User user) {    userDao.save(user);    return user.getId();}

    测试效果:

    3. 根据ID查询文档

    controller 层:

    @GetMapping("/{id}")public User getById(@PathVariable("id") Long id) {    return userService.getById(id);}

    service 层:

    @Overridepublic User getById(Long id) {    Optional find = userDao.findById(id);    if (find.isPresent()) {        return find.get();    }    return null;}

    测试效果:

    4. 根据ID删除文档

    controller 层:

    @DeleteMapping("/{id}")public String deleteById(@PathVariable("id") Long id) {    userService.deleteById(id);    return "删除成功";}

    service 层:

    @Overridepublic void deleteById(Long id) {    userDao.deleteById(id);}

    测试效果:

    5. 查询所有文档

    controller 层:

    @GetMapping("/all")public List all() {    return userService.getAll();}

    service 层:

    @Overridepublic List getAll() {    Iterable users = userDao.findAll();    if (users == null) {        return Collections.emptyList();    }    List userList = new ArrayList();    users.forEach(o -> userList.add(o));    return userList;}

    测试效果:

    6. 条件查询(单个条件)

    如:查询name包含"玛丽"的数据

    controller 层:

    @GetMapping("/listByName")public List listByName(String name) {    return userService.getListByName(name);}

    service 层:

    @Overridepublic List getListByName(String name) {    return userDao.findByName(name);}

    dao 层:测试效果:

    7. 条件查询(多条件)

    如:查询 name包含"玛丽",年龄为25的数据。

    controller 层:

    @GetMapping("/listByNameAndAge")public List listByNameAndAge(String name, Integer age) {    return userService.getListByNameAndAge(name, age);}

    service 层:

    @Overridepublic List getListByNameAndAge(String name, Integer age) {    return userDao.findByNameAndAge(name, age);}

    dao 层:

    List findByNameAndAge(String name, Integer age);

    8. 分页查询(降序)

    controller 层:

    @GetMapping("/listOrderByAgeDesc")public List listOrderByAgeDesc() {    return userService.getListOrderByAgeDesc();}

    service 层:

    @Overridepublic List getListOrderByAgeDesc() {    return userDao.findByOrderByAgeDesc();}

    dao 层:

    List findByOrderByAgeDesc();

    测试效果:

    9. 分页查询(升序)

    controller 层:

    @GetMapping("/listOrderByAgeAsc")public List listOrderByAgeAsc() {    return userService.getListOrderByAgeAsc();}

    service 层:

    @Overridepublic List getListOrderByAgeAsc() {    return userDao.findByOrderByAgeAsc();}

    dao 层:

    List findByOrderByAgeAsc();

    测试效果:

    10. 分页查询

    controller 层:

    @GetMapping("/page")public Page page(Integer pageNum, Integer pageSize) {    return userService.getPage(pageNum, pageSize);}

    service 层:

    @Overridepublic Page getPage(int pageNum, int pageSize) {    // 注意,这里的pageNum是从0开始的,如果要查询第1页数据,pageNum应该为0    Pageable pageable = PageRequest.of(pageNum, pageSize);    return userDao.findAll(pageable);}

    测试效果:

    11. 范围查询( > )

    controller 层:

    @GetMapping("/listGreaterThanAge")public List listGreaterThanAge(Integer age) {    return userService.getListGreaterThanAge(age);}

    service 层:

    @Overridepublic List getListGreaterThanAge(Integer age) {    return userDao.findByAgeGreaterThan(age);}

    dao 层:

    List findByAgeGreaterThan(Integer age);

    测试效果:

    12. 范围查询( >= )

    controller 层:

    @GetMapping("/listGreaterThanEqualAge")public List listGreaterThanEqualAge(Integer age) {    return userService.getListGreaterThanEqualAge(age);}

    service 层:

    @Overridepublic List getListGreaterThanEqualAge(Integer age) {    return userDao.findByAgeGreaterThanEqual(age);}

    dao 层:

    List findByAgeGreaterThanEqual(Integer age);

    测试效果:

    13. 范围查询( < )

    controller 层:

    @GetMapping("/listLessThanAge")public List listLessThanAge(Integer age) {    return userService.getListLessThanAge(age);}

    service 层:

    @Overridepublic List getListLessThanAge(Integer age) {    return userDao.findByAgeLessThan(age);}

    dao 层:

    List findByAgeLessThan(Integer age);

    测试效果:

    14. 范围查询( <= )

    controller 层:

    @GetMapping("/listLessThanEqualAge")public List listLessThanEqualAge(Integer age) {    return userService.getListLessThanEqualAge(age);}

    service 层:

    @Overridepublic List getListLessThanEqualAge(Integer age) {    return userDao.findByAgeLessThanEqual(age);}

    dao 层:

    List findByAgeLessThanEqual(Integer age);

    测试效果:

    ElasticSearch中对索引的一些常用操作

    1. 获取Elasticsearch中所有的index:

    curl -XGET 'localhost:9200/_cat/indices?v&pretty'

    2. 获取某索引下所有的type:

    获取elasticsearch索引下所有的type定义

    curl -XGET 'localhost:9200/elasticsearch/_mapping'

    3. 删除索引:

    删除elasticsearch2索引

    curl -XDELETE 'localhost:9200/elasticsearch2?pretty'

    4. 删除某索引下的某type数据:

    删除索引elasticsearch下的article类型

    curl -XDELETE 'http://localhost:9200/elasticsearch/article/'

    5. 查看某索引的某type下所有的数据:

    查找elasticsearch索引中所有的类型为Company的数据

    http://localhost:9200/elasticsearch/Company/_search

    以上是"Springboot如何集成Elasticsearch"这篇文章的所有内容,感谢各位的阅读!相信大家都有了一定的了解,希望分享的内容对大家有所帮助,如果还想学习更多知识,欢迎关注行业资讯频道!

    0