五分钟在springboot中集成Elasticsearch

2020/06/10

Elasticsearch 是一个开源的分布式 RESTful 搜索和分析引擎,它使您可以快速,近乎实时地存储,搜索和分析大量数据,能够解决越来越多不同的应用场景。

  • 比如用作搜索网络商店的商品,用户的搜索,交易数据的搜索。
  • 业务的收集和存储
  • 报表的分析

在Springboot中如何使用elasticsearch去存储和查询数据呢,目前来说有以下几种方式比较便捷:

  • REST Client
  • Spring Data
  • Spring Data Elasticsearch Repositories

本文将使用Spring Data Elasticsearch Repositories这种方式去访问Elasticsearch。

准备

需要自己搭建一台Elasticsearch,elasticsearch的版本为7.7.0。本次Elasticsearch为单机版本Elasticsearch,生产环境要使用集群版本。执行下面命令安装

# 下载elasticsearch的rpm
wget https://artifacts.elastic.co/downloads/elasticsearch/elasticsearch-7.7.0-x86_64.rpm
wget https://artifacts.elastic.co/downloads/elasticsearch/elasticsearch-7.7.0-x86_64.rpm.sha512
shasum -a 512 -c elasticsearch-7.7.0-x86_64.rpm.sha512 
sudo rpm --install elasticsearch-7.7.0-x86_64.rpm
sudo systemctl daemon-reload
sudo systemctl enable elasticsearch.service
sudo systemctl start elasticsearch.servic

修改es给其他ip访问:

cluster.name: "docker-cluster"
network.host: 0.0.0.0

# custom config
node.name: "node-1"
discovery.seed_hosts: ["127.0.0.1", "[::1]"]
cluster.initial_master_nodes: ["node-1"]
# 开启跨域访问支持,默认为false
http.cors.enabled: true
# 跨域访问允许的域名地址,(允许所有域名)以上使用正则
http.cors.allow-origin: /.*/ 

Spring boot集成Elasticsearch

在springboot的工程的pom文件中引入elasticsearch的起步依赖spring-boot-starter-data-elasticsearch,如下:

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

在springboot的配置文件application.properties文件填写elasticesearch的配置,这里使用的9300端口,即使用TCP协议端口。

server.port=8500
spring.data.elasticsearch.cluster-nodes=127.0.0.1:9300
spring.data.elasticsearch.cluster-name=my-application

和大多数spring-boot-starter-data-jpa类似,都是使用实体对象和数据库的存储结构字段对应起来的。使用@Document(indexName = “user”)注解,会在elasticesearch里面创建一个user的索引,@Id注解白名uId字段为elasticsearch的id字段。

@Document(indexName = "user")
public class User implements Serializable {

    @Id
    private String uId;

    private String name;

    private Integer age;

    private String address;
    
    //省略getter setter 
    }

写一个接口UserRepository继承ElasticsearchRepository,ElasticsearchRepository包含了基本的增删改查的能力,并在接口类上加上@Repository注解,注入到spring 容器中。

@Repository
public interface UserRepository extends ElasticsearchRepository<User, String> {

}

UserServiceImpl类去操作UserRepository的接口,去操作Elasticsearch。


@Service
public class UserServiceImpl implements UserService {

    @Autowired
    private UserRepository userRepository;


    @Override
    public long count() {
        return userRepository.count();
    }

    @Override
    public User save(User user) {
        return userRepository.save(user);
    }

    @Override
    public void delete(User user) {
        userRepository.delete(user);
    }

    @Override
    public Iterable<User> getAll() {
        return userRepository.findAll();
    }

    @Override
    public List<User> getByName(String name) {
        List<User> list = new ArrayList<>();
        MatchQueryBuilder matchQueryBuilder = new MatchQueryBuilder("name", name);
        Iterable<User> iterable = userRepository.search(matchQueryBuilder);
        iterable.forEach(e->list.add(e));
        return list;
    }

    @Override
    public Page<User> pageQuery(Integer pageNo, Integer pageSize, String kw) {
        NativeSearchQuery searchQuery = new NativeSearchQueryBuilder()
                .withQuery(QueryBuilders.matchPhraseQuery("name", kw))
                .withPageable(PageRequest.of(pageNo, pageSize))
                .build();
        return userRepository.search(searchQuery);
    }
}

写一个测试类,然后依次调用接口:

@RestController
public class TestController {

    @Autowired
    private UserService userService;


    @GetMapping("/testInsert")
    public void testInsert() {
        User user = new User();
        user.setuId("1");
        user.setName("zhangsna");
        user.setAge(101);
        user.setAddress("广东省深圳市");
        userService.save(user);

        user.setuId("2");
        user.setName("lisi");
        user.setAge(32);
        user.setAddress("广东省深圳市");
        userService.save(user);

        user.setuId("3");
        user.setName("wangwu");
        user.setAge(34);
        user.setAddress("广东省深圳市");
        userService.save(user);

    }

    @GetMapping("/testDelete")
    public void testDelete() {
        User user = new User();
        user.setuId("1");
        userService.delete(user);
    }

    @GetMapping("/testGetAll")
    public void testGetAll() {
        Iterable<User> iterable = userService.getAll();
        iterable.forEach(e -> System.out.println(e.toString()));
    }

    @GetMapping("/testGetByName")
    public void testGetByName() {
        List<User> list = userService.getByName("lisi");
        System.out.println(list);
    }

    @GetMapping("/testPage")
    public void testPage() {
        Page<User> page = userService.pageQuery(0, 10, "wangwu");
        System.out.println(page.getTotalPages());
        System.out.println(page.getNumber());
        System.out.println(page.getContent());
    }
}

kibana展示数据

首先需要按照kibana,安装命令如下:

wget https://artifacts.elastic.co/downloads/kibana/kibana-7.7.0-x86_64.rpm
shasum -a 512 kibana-7.7.0-x86_64.rpm 
sudo rpm --install kibana-7.7.0-x86_64.rpm

//设置kibana开机自启
sudo /bin/systemctl daemon-reload
sudo /bin/systemctl enable kibana.service


sudo systemctl start kibana.service //启动kibana
sudo systemctl stop kibana.service   //停止kibana

启动成功后,在浏览器上访问kibana的地址http://10.10.10.1:5601,进入kibana的主界面。然后进到Discover界面。选择user的索引,就可以正常展示数据,数据如下:

本文为原创文章,转载请标明出处。
本文链接:https://www.fangzhipeng.com/architecture/2020/06/10/sb-es.html
本文出自方志朋的博客


(转载本站文章请注明作者和出处 方志朋-forezp

宝剑锋从磨砺出,梅花香自苦寒来,用心分享,一起成长,做有温度的攻城狮!

Post Directory