• 什么是Elasticsearch
           Elasticsearch (ES)是一个基于Lucene构建的开源、分布式、RESTful 接口全文搜索引擎。Elasticsearch 还是一个分布式文档数据库,其中每个字段均是被索引的数据且可被搜索,它能够扩展至数以百计的服务器存储以及处理PB级的数据。它可以在很短的时间内在储、搜索和分析大量的数据。它通常作为具有复杂搜索场景情况下的核心发动机。
    Elasticsearch就是为高可用和可扩展而生的。可以通过购置性能更强的服务器来完成。
    官网:https://www.elastic.co/downloads/elasticsearch
    中文社区https://es.xiaoleilu.com/ 
    什么是PB级别https://baike.baidu.com/item/PetaByte/5910820
     
  • Elasticsearch优势
    1、横向可扩展性:只需要增加台服务器,做一点儿配置,启动一下Elasticsearch就可以并入集群。 
    2、分片机制提供更好的分布性:同一个索引分成多个分片(sharding);分而治之的方式可提升处理效率。
    3、高可用:提供复制( replica) 机制,一个分片可以设置多个复制,使得某台服务器在宕机的情况下,集群仍旧可以照常运行,并会把服务器宕机丢失的数据信息复制恢复到其他可用节点上。
     
  • Elasticsearch应用场景 
    大型分布式日志分析系统ELK  elasticsearch(存储日志)+logstash(收集日志)+kibana(展示数据)
    大型电商商品搜索系统、网站站内搜索、网盘搜索引擎等。 
     
  • Elasticsearch存储结构
     Elasticsearch是文件存储,Elasticsearch是面向文档型数据库,一条数据在这里就是一个文档,用JSON作为文档序列化的格式,比如下面这条用户数据:
     
    {
        "name" :     "admin",
        "sex" :      0,
        "age" :      25
    }
    
       关系数据库存储方式为     ⇒ 数据库 ⇒ 表     ⇒ 行    ⇒ 列(Columns)
    Elasticsearch存储方式为    ⇒ 索引(Index)   ⇒ 类型(type)  ⇒ 文档(Docments)  ⇒ 字段(Fields)  
  • Kibana可视化界面
    Kibana是一个开源的分析和可视化平台,设计用于和Elasticsearch一起工作。
    你用Kibana来搜索,查看,并和存储在Elasticsearch索引中的数据进行交互。
    你可以轻松地执行高级数据分析,并且以各种图标、表格和地图的形式可视化数据。
    Kibana使得理解大量数据变得很容易。它简单的、基于浏览器的界面使你能够快速创建和共享动态仪表板,实时显示Elasticsearch查询的变化。
  • linux安装elasticsearch
     
     环境:  本次安装的JDK环境是JDK1.8(64),elasticsearch版本6.0以上,es默认启动内存是1G 
     --------------使用端口----
     9300端口: ES节点之间通讯使用
     9200端口: ES节点 和 外部 通讯使用
  1. 下载elasticsearch-6.4.3
    地址: 

    下载完成后,将文件上传到/usr/local下
  2. 解压elasticsearch
     
    cd /usr/local
    tar -zxvf elasticsearch-6.4.3.tar.gz
    // 重命名
    mv elasticsearch-6.4.3 elasticsearch6.4
  3. 修改elaticsearch.yml配置文件
    // 进入config目录
    vi elaticsearch.yml
    
    #################修改2处###########
    network.host: 192.168.127.132     // 默认注释掉的,并修改成你的服务器ip 或者设置为0.0.0.0表示允许外网访问
    http.port: 9200                   // 默认注释掉的,使用默认的9200 
    
    
    

     
  4. 创建用户 
    因为elasticsearch不支持root用户启动,所以我们得创建非root用户,依次执行下面命令
     
    // 创建分组
    groupadd basic
    // 创建用户 密码123456
    useradd xiaobo -g basic -p 123456
    // 给用户授权elasticsearch6.4
    chown -R xiaobo:basic  elasticsearch6.4
    // 切换用户
    su xiaobo
  5. 切换非root账户,启动elasticsearch
     注意:  不要使用root账户启动,
    cd /usr/local/elasticsearch6.4/bin
    ./elasticsearch
    我们发现还是启动报错,继续下面步骤
  6. 启动报错1
     
     解决: 
     
    // 切换root用户
    su root
    cd /etc
    vi sysctl.conf
    ##############新增如下配置
    vm.max_map_count=655360
    ##############保存,退出
    // 执行下面命令
    sysctl -p
  7. 启动报错2
     
     
    vi /etc/security/limits.conf
    ###########配置如下内容, '*'号也要
    * soft nofile 65536
    * hard nofile 131072
    * soft nproc 2048
    * hard nproc 4096
    ##############保存、退出
    //重启虚拟机 
    shutdown -r now
    2个错误原因: 因为新创建的用户最大可创建文件数太小,最大虚拟内存太小
  8. 再次启动 
     
    // 关闭防火墙
    systemctl stop firewalld.service
    cd /usr/local/elasticsearch6.4/bin
    // 后台启动
    ./elasticsearch -d
  9. 测试
     地址: http://192.168.127.132:9200/
     
     
    如上图所示 ,  elastaisearch安装完成!!!
  • Kibana可视化界面安装
  1. 下载 Kibana6.4.3,下载完成后,将文件上传到/usr/local下
     地址: 
     
  2. 解压
    cd /usr/local
    tar -zxvf kibana-6.4.3-linux-x86_64.tar.gz
  3. 重命名
     
    mv kibana-6.4.3-linux-x86_64 kibana6.4
  4. 修改kibana.yml配置文件
     
    cd kibana6.4/config/
    vi kibana.yml
    #############修改3处
    server.port: 5601          
    server.host: "192.168.127.132" 
    elasticsearch.url: "http:// 192.168.127.132:9200"
    #############保存、退出
    
  5. 启动
     // 先启动elasticseach 
     
    su xiaobo
    cd /usr/local/elasticsearch6.4/bin
    ./elasticsearch -d

     
     // 启动kibana
    su root
    cd /usr/local/kibana6.4/bin
    ./kibana
  6. 测试
     
     http://192.168.127.132:5601

     安装完成!!!
  • Elasticsearch简单操作
     
    我们一般数据库保存数据方式为:      ⇒ 创建数据库           ⇒ 创建表 (user表) ⇒ 行(一条数据)       ⇒ 列(Fields)  
    Elasticsearch保存数据方式为           ⇒ 创建索引(Index)   ⇒ 创建类型(type)  ⇒ 文档(Docments)  ⇒ 字段(Fields)  
     
    #######1、创建索引
    PUT /basic
    #######2、查询索引
    GET /basic
    #######3、创建文档  方式: /索引/文档/id    编辑同样使用该方法
    PUT /basic/user/1
    {
      "name":"xiaobo",
      "age":28,
      "address":"安徽合肥市"
    }
    #######3、查询文档  方式: /索引/文档/id
    GET /basic/user/1
    #######4、删除索引
    DELETE /basic
     类似于mysql得操作:  
     创建basic数据库
     创建user表 
     添加一条id为1得user记录
      
     其他查询语句
     
    #######使用POST自动生成ID添加数据
    POST /basic/user/
    {
      "name":"刘德华65",
      "age":65,
      "address":"中国"
    }
    #######指定id查询
    GET /basic/user/7OUdFm0B_Kbnp8-CVruy
    #######查询所有
    GET /basic/user/_search
    #######根据id集合查询
    GET /basic/user/_mget
    {
      "ids":[1,2]  
    }
    #######查询年龄等于19岁的用户
    GET /basic/user/_search?q=age:19
    #######查询年龄在30-65的并排序
    GET /basic/user/_search?q=age[30 TO 65]&sort=age:desc
    #######排序并分页查询
    GET /basic/user/_search?sort=age:desc&from=0&size=2
    #######只展示name、age字段的属性值
    GET /basic/user/_search?&_source=name,age
    
    使用9200端口查询URL:  http://192.168.127.132:9200/basic/user/_search
  •  Elasticsearch使用乐观锁进行版本控制
     
     如下图所示: 每次对用户id为2进行修改,_version都会自增加1。 
     使用乐观锁机制保证多线程情况下安全问题,每次修改都会判断: where version=3
     
     
  • Springboot整合ElasticSearch
     
  1. 创建Springboot项目,pom.xml引入依赖
     
      <parent>
        <groupId>org.springframework.boot</groupId>
        <artifactId>spring-boot-starter-parent</artifactId>
        <version>2.1.5.RELEASE</version>
        <relativePath /> <!-- lookup parent from repository -->
      </parent>
      <dependencies>
        <dependency>
          <groupId>org.springframework.boot</groupId>
          <artifactId>spring-boot-starter-web</artifactId>
        </dependency>
        <dependency>
          <groupId>org.springframework.boot</groupId>
          <artifactId>spring-boot-starter-data-elasticsearch</artifactId>
        </dependency>
        <dependency>
          <groupId>org.projectlombok</groupId>
          <artifactId>lombok</artifactId>
        </dependency>
      </dependencies>
  2. application.yml配置如下
     
     
    spring:
      data:
        elasticsearch:
          ####集群名称
          cluster-name: elasticsearch
          ####地址
          cluster-nodes: 192.168.127.132:9300
    
    注意: 集群名称cluster-name: elasticsearch,默认就是elasticsearch。查看: http://192.168.127.132:9200/
     
     如果需要修改,可以在/usr/local/elasticsearch6.4/config/elasticsearch.yml中配置, 我这里没改,就用默认的 
     
     
  3. 创建实体类 UserEntity.java
     
    import lombok.Data;
    import org.springframework.data.annotation.Id;
    import org.springframework.data.elasticsearch.annotations.Document;
    
    /**
     * Create by wangxb
     * 2019-09-08 18:48
     */
    @Document(indexName = "basic", type = "user")
    @Data
    public class UserEntity {
    
        @Id
        private String id;
        private String name;
        private Integer age;
        private String address;
    }
     indexName:索引名称
     type: 文档类型名称
  4. 创建UserDAO.java
     
    import com.basic.entity.UserEntity;
    import org.springframework.data.repository.CrudRepository;
    
    /**
     * Create by wangxb
     * 2019-09-08 18:53
     */
    public interface UserDAO extends CrudRepository<UserEntity, String> {
    
    }
  5. 创建IndexController.java
     
     
    import com.basic.dao.UserDAO;
    import com.basic.entity.UserEntity;
    import org.springframework.beans.factory.annotation.Autowired;
    import org.springframework.web.bind.annotation.RequestBody;
    import org.springframework.web.bind.annotation.RequestMapping;
    import org.springframework.web.bind.annotation.RestController;
    import java.util.Optional;
    
    /**
     * Create by wangxb
     * 2019-09-08 18:54
     */
    @RestController
    public class IndexController {
    
        @Autowired
        private UserDAO userDAO;
    
        @RequestMapping("/addUser")
        public UserEntity addUser(@RequestBody UserEntity user) {
            return userDAO.save(user);
        }
    
        @RequestMapping("/findUser")
        public Optional<UserEntity> findUser(String id) {
            return userDAO.findById(id);
        }
    
    }
  6. 启动项目 
     
     
    import org.springframework.boot.SpringApplication;
    import org.springframework.boot.autoconfigure.SpringBootApplication;
    import org.springframework.data.elasticsearch.repository.config.EnableElasticsearchRepositories;
    
    /**
     * Hello world!
     *
     */
    @SpringBootApplication
    @EnableElasticsearchRepositories(basePackages = "com.basic.dao")
    public class AppES
    {
        public static void main( String[] args )
        {
            SpringApplication.run(AppES.class, args);
        }
    }

     
  7. 测试
     添加数据: http://localhost:8080/addUser
     
     
    查询数据: http://localhost:8080/findUser?id=8 
     
  8.  
Logo

开放原子开发者工作坊旨在鼓励更多人参与开源活动,与志同道合的开发者们相互交流开发经验、分享开发心得、获取前沿技术趋势。工作坊有多种形式的开发者活动,如meetup、训练营等,主打技术交流,干货满满,真诚地邀请各位开发者共同参与!

更多推荐