从零学 spring cloud第6-2课:Nosql之ElasticSearch

    项目的DEMO代码:https://github.com/heyu52/-spring-cloud
    以下介绍来自百度百科
    ElasticSearch 是一个分布式、高扩展、高实时的搜索与数据分析引擎。它能很方便的使大量数据具有搜索、分析和探索的能力。充分利用ElasticSearch的水平伸缩性,能使数据在生产环境变得更有价值。ElasticSearch 的实现原理主要分为以下几个步骤,首先用户将数据提交到Elastic Search 数据库中,再通过分词控制器去将对应的语句分词,将其权重和分词结果一并存入数据,当用户搜索数据时候,再根据权重将结果排名,打分,再将返回结果呈现给用户。
    Elasticsearch是与名为Logstash的数据收集和日志解析引擎以及名为Kibana的分析和可视化平台一起开发的。这三个产品被设计成一个集成解决方案,称为“Elastic Stack”(以前称为“ELK stack”)。
    Elasticsearch可以用于搜索各种文档。它提供可扩展的搜索,具有接近实时的搜索,并支持多租户。”Elasticsearch是分布式的,这意味着索引可以被分成分片,每个分片可以有0个或多个副本。每个节点托管一个或多个分片,并充当协调器将操作委托给正确的分片。再平衡和路由是自动完成的。“相关数据通常存储在同一个索引中,该索引由一个或多个主分片和零个或多个复制分片组成。一旦创建了索引,就不能更改主分片的数量。
    Elasticsearch使用Lucene,并试图通过JSON和Java API提供其所有特性。它支持facetting和percolating,如果新文档与注册查询匹配,这对于通知非常有用。另一个特性称为“网关”,处理索引的长期持久性;例如,在服务器崩溃的情况下,可以从网关恢复索引。Elasticsearch支持实时GET请求,适合作为NoSQL数据存储,但缺少分布式事务。

有关概念

  • cluster:代表一个集群,集群中有多个节点,其中有一个为主节点,这个主节点是可以通过选举产生的,主从节点是对于集群内部来说的。es的一个概念就是去中心化,字面上理解就是无中心节点,这是对于集群外部来说的,因为从外部来看es集群,在逻辑上是个整体,你与任何一个节点的通信和与整个es集群通信是等价的。
  • shards:代表索引分片,es可以把一个完整的索引分成多个分片,这样的好处是可以把一个大的索引拆分成多个,分布到不同的节点上。构成分布式搜索。分片的数量只能在索引创建前指定,并且索引创建后不能更改。
  • replicas:代表索引副本,es可以设置多个索引的副本,副本的作用一是提高系统的容错性,当某个节点某个分片损坏或丢失时可以从副本中恢复。二是提高es的查询效率,es会自动对搜索请求进行负载均衡。
  • recovery:代表数据恢复或叫数据重新分布,es在有节点加入或退出时会根据机器的负载对索引分片进行重新分配,挂掉的节点重新启动时也会进行数据恢复。
  • river:代表es的一个数据源,也是其它存储方式(如:数据库)同步数据到es的一个方法。它是以插件方式存在的一个es服务,通过读取river中的数据并把它索引到es中,官方的river有couchDB的,RabbitMQ的,Twitter的,Wikipedia的。
  • gateway:代表es索引快照的存储方式,es默认是先把索引存放到内存中,当内存满了时再持久化到本地硬盘。gateway对索引快照进行存储,当这个es集群关闭再重新启动时就会从gateway中读取索引备份数据。es支持多种类型的gateway,有本地文件系统(默认),分布式文件系统,Hadoop的HDFS和amazon的s3云存储服务。
  • discovery.zen:代表es的自动发现节点机制,es是一个基于p2p的系统,它先通过广播寻找存在的节点,再通过多播协议来进行节点之间的通信,同时也支持点对点的交互。
  • Transport:代表es内部节点或集群与客户端的交互方式,默认内部是使用tcp协议进行交互,同时它支持http协议(json格式)、thrift、servlet、memcached、zeroMQ等的传输协议(通过插件方式集成)。

Elasticsearch官网:https://www.elastic.co/cn/products/elasticsearch
Elastic官网:https://www.elastic.co/cn/
Elastic有一条完整的产品线:Elasticsearch、Kibana、Logstash等,就是大家常说的ELK技术栈。

安装
docker镜像地址:https://hub.docker.com/_/elasticsearch

docker pull elasticsearch

在这里插入图片描述
我想说的,这个是安装不成功的,得指定版本,我装的是6.8.2

docker pull elasticsearch:6.8.2

在这里插入图片描述
镜像网页上还有一个关于生产环境安装的指引,版本是6.4.2:https://www.elastic.co/guide/en/elasticsearch/reference/6.4/docker.html

运行

docker run -d --name elasticsearch -p 9200:9200 -p 9300:9300 -e "discovery.type=single-node" elasticsearch:6.8.2

我们在浏览器输入:http://192.168.0.123:9200/
在这里插入图片描述
能看到上面的信息,表明Elasticsearch已经安装成功了,等下我们配置连接,要使用到上面的一些信息。

在这里插入图片描述
从这节起引用Lombok,懒得写那么多代码了。

创建model

package com.csdn.demo.model;

import lombok.*;
import org.springframework.data.annotation.Id;
import org.springframework.data.elasticsearch.annotations.Document;

//文档(document)	存入索引库原始的数据。比如每一条商品信息,就是一个文档
//索引库(indices)	indices是index的复数,代表许多的索引,
//类型(type)	    类型是模拟mysql中的table概念,一个索引库下可以有不同类型的索引,比如商品索引,订单索引,其数据格式不同。不过这会导致索引库混乱,因此未来版本中会移除这个概念
//分片(shard)     数据拆分后的各个部分
//副本(replica)   每个分片的复制
//字段(field)	    文档中的属性
//映射配置(mappings)	字段的数据类型、属性、是否索引、是否存储等特性
@Data
@AllArgsConstructor
@NoArgsConstructor
@Builder
@ToString
@Document(indexName = "user", type = "user", shards = 1, replicas = 0, refreshInterval = "-1")
public class User {
    @Id
    private String id;
    private String userName;
    private String address;
    private int age;

    public User(String userName, String address, int age) {
        this.userName = userName;
        this.address = address;
        this.age = age;
    }
}

创建Repository

package com.csdn.demo.Repository;

import com.csdn.demo.model.User;
import org.springframework.data.domain.Page;
import org.springframework.data.domain.Pageable;
import org.springframework.data.elasticsearch.repository.ElasticsearchRepository;

import java.util.List;

public interface UserRepository extends ElasticsearchRepository<User, String> {
    public List<User> findByAddress(String address);
    
    public User findByUserName(String userName);
    
    public int  deleteByUserName(String userName);
    
    public Page<User> findByAddress(String address, Pageable pageable);
    
}

创建Controller

package com.csdn.demo.web;

import com.csdn.demo.Repository.UserRepository;
import com.csdn.demo.model.User;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.data.domain.Page;
import org.springframework.data.domain.PageRequest;
import org.springframework.data.domain.Pageable;
import org.springframework.data.domain.Sort;
import org.springframework.data.elasticsearch.core.ElasticsearchTemplate;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RestController;

@RestController
public class MyController {
    @Autowired
    private UserRepository repository;
    @Autowired
    private ElasticsearchTemplate elasticsearchTemplate;

    @RequestMapping("saveUsers")
    public void saveUsers() {
        repository.save(new User("csdn01", "深圳01", 11));
        repository.save(new User("csdn02", "深圳02", 12));
        repository.save(new User("csdn03", "深圳03", 13));
        repository.save(new User("csdn04", "深圳04", 14));
        repository.save(new User("csdn05", "深圳05", 15));
        repository.save(new User("csdn06", "深圳06", 16));

    }

    @RequestMapping("fetchAllUsers")
    public String fetchAllCustomers() {
        Iterable<User> iterable = repository.findAll();

        String value="";

        for (User user :iterable) {
            value+= user.toString();
        }

        return value;
    }
    @RequestMapping("updateUsers")
    public String updateUsers() {

        User user= repository.findByUserName("csdn04");
        user.setAddress("深圳007");
        repository.save(user);
        user=repository.findByUserName("csdn04");
        return user.toString();
    }
    @RequestMapping("fetchPageUsers")
    public String fetchPageUsers() {

        Sort sort = new Sort(Sort.Direction.DESC, "address.keyword");
        Pageable pageable = PageRequest.of(0, 10, sort);
        Page<User> users=repository.findByAddress("深圳01", pageable);

        return users.getContent().toString();
    }
}

配置连接

spring.data.elasticsearch.cluster-name=docker-cluster
# 集群节点地址列表,用逗号分隔
spring.data.elasticsearch.cluster-nodes=192.168.0.123:9300

如果编译报错,按如下修改配置
在这里插入图片描述
测试
浏览器输入
http://127.0.0.1:8080/saveUsers
http://127.0.0.1:8080/fetchAllUsers
在这里插入图片描述
http://127.0.0.1:8080/fetchPageUsers 测试分页
在这里插入图片描述
Spring Boot 项目中对 ElasticSearch 的增、删、改、查操作,通过上面的操作也可以发现操作 ElasticSearch 的语法和 Spring Data JPA 的语法非常类似,其它别的语法,这里就不讲了,都差不了多少。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值