6

五分钟在springboot中集成Elasticsearch

 3 years ago
source link: https://www.fangzhipeng.com/architecture/2020/06/10/sb-es.html
Go to the source link to view the article. You can view the picture content, updated content and better typesetting reading experience. If the link is broken, please click the button below to view the snapshot at that time.
neoserver,ios ssh client

五分钟在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的索引,就可以正常展示数据,数据如下:

es01.png

About Joyk


Aggregate valuable and interesting links.
Joyk means Joy of geeK