什么是ElasticSearch?
ElasticSearch 是一个分布式、高扩展、高实时的搜索与数据分析引擎。它能很方便的使大量数据具有搜索、分析和探索的能力。
作用于全文搜索,结构化搜索,分析。

ES的主要概念与Mysql相比

es bulk更新json 里面的字段_mysql

  1. Index表示一个数据库
  2. Type表示一张表
  3. Doucument表示一行数据
  4. Field表示字段

安装ES

下面演示的是用windows系统安装ES

  1. 访问 Elasticsearch 官网
    https://www.elastic.co/cn/downloads/elasticsearch 下载安装包:
  2. 将zip文件解压到C盘,进入 C:\elasticsearch-2.4.4\bin 目录,双击执行
    elasticsearch.bat,该脚本文件执行 ElasticSearch 安装程序,稍等片刻,打开浏览器,输入
    http://localhost:9200 ,显式以下画面,说明ES安装成功。

es bulk更新json 里面的字段_bc_02


安装head插件

作用:
为了便于管理ES,本文使用head插件,这是最初级的管理工具,在浏览器中显示ES集群,索引等信息,十分好用。

1.因为运行head需要借助grunt命令,所以需要grunt命令,进入nodejs目录下,执行命令:npm install -g grunt-cli,将grunt安装为全局命令。

2.到head目录下下载包,执行命令:npm install,若出现error错误,可尝试以管理员身份运行cmd,重新执行此命令,期间下载pathomjs可能时间比较长,需要耐心等待。

3.到head插件目录,运行grunt server,启动head。(可以进入elasticsearch-head下Gruntfile.js文件,修改启动端口,默认是9100)如下图,成功连接9100端口

es bulk更新json 里面的字段_elasticsearch_03


4.重新启动elasticsearch.bat,访问http://localhost:9100/,即可看到head效果

es bulk更新json 里面的字段_bc_04


如果不能打开网站:

打开路径 "…\elasticsearch\config\ " 下的 elasticsearch.yml 文件,在文件末尾添加如下代码:

http.cors.enabled: true

http.cors.allow-origin: “*”

http.cors.allow-methods: OPTIONS, HEAD, GET, POST, PUT, DELETE

http.cors.allow-headers: “X-Requested-With, Content-Type, Content-Length, X-User”


安装logstash 插件
作用:
用来同步mysql的数据到ES中

es bulk更新json 里面的字段_mysql_05


Windows环境:

  1、下载logstash

  地址: https://www.elastic.co/cn/downloads/logstash

  2、下载: mysql-connector-java.jar

  在logstash目录下创建一个mysql目录,把驱动文件放进去。

  2、修改配置文件

  在安装目录下,创建新的配置文件,命名为:mysqltoes.conf 

  这个文件名可以换成其他的,启动时脚本命令改成对应的就可以了。

  在conf文件中加入以下内容:

input {
  
//多张表的同步只需要设置多个jdbc的模块就行了
  jdbc {
      # mysql 数据库链接,shop为数据库名
      jdbc_connection_string => "jdbc:mysql://数据库IP地址:3306/test?useUnicode=true&characterEncoding=utf8&serverTimezone=UTC"
      # 用户名和密码
      jdbc_user => "root"
      jdbc_password => ""

      # 驱动
      jdbc_driver_library => "E:/DevelopEnvironment/Logstash/logstash-7.2.0/mysql/mysql-connector-java-8.0.16.jar"

      # 驱动类名
      jdbc_driver_class => "com.mysql.jdbc.Driver"

      #是否分页
      jdbc_paging_enabled => "true"
      jdbc_page_size => "50000"

      #直接执行sql语句
      statement =>"select * from employee"
      # 执行的sql 文件路径+名称
      # statement_filepath => "/hw/elasticsearch/logstash-6.2.4/bin/test.sql"

      #设置监听间隔  各字段含义(由左至右)分、时、天、月、年,全部为*默认含义为每分钟都更新
      schedule => "* * * * *"

      # 索引类型
      #type => "jdbc"
    }

}

output {
  elasticsearch {
        #es的ip和端口
        hosts => ["http://ip:9200"]
        #ES索引名称(自己定义的)
            index => "blog"
        #文档类型
        document_type => "log"
        #设置数据的id为数据库中的字段
        document_id => "%{id}"
    }
    stdout {
        codec => json_lines
    }

}

坑一
conf用UTF-8编码

坑二
#自增ID
document_id => “%{数据库中的id}”

坑三
statement_filepath => “D:/logstash-7.6.1/sql/test.sql” 的意思是 执行指定的sql文件
sql语句是查询具体你要的哪一个表的语言 比如 selectfrom student
而不是select
from 数据库名字 .
或者是 直接执行sql语句 例如 statement =>"select * from student "


Springboot如何整合ES

  • 方法一
  • 用JPA直接操作ES

application.properties中配置

## 开启repositories
spring.data.elasticsearch.repositories.enabled = true
spring.data.elasticsearch.client.cluster-nodes =127.0.0.1\:9300
spring.data.elasticsearch.client.reactive.username=elasticsearch

先创建实体类
**

@Data
@AllArgsConstructor
@NoArgsConstructor
@EqualsAndHashCode(callSuper = false)
@Accessors(chain = true)
@Document(indexName = "sl_test", type = "_doc")
public class Student implements Serializable {
    private static final long serialVersionUID=1L;
    @Id
    private String sno;
    @Field
    private String sname;
    @Field
    private String ssex;
    @Field
    @DateTimeFormat(pattern = "yyyy-MM-dd HH:mm:ss")
    @JsonSerialize(using = LocalDateTimeSerializer.class)
    @JsonDeserialize(using = LocalDateTimeDeserializer.class)
    private LocalDateTime sbirthday;
    @Field
    private String sclass;
}

创建类集成ElasticsearchRepository<Student,String> 前面一个参数填实体类 后面一个参数填写 ID字段属性

public interface StudentRepostitory extends ElasticsearchRepository<Student,String> {


}

Controler层

@RestController
@RequestMapping("/es")
public class StudentController {

    @Autowired
    private StudentRepostitory studentRepostitory;

        @RequestMapping("/id")
        public Student findStudentById(String id){
           Optional<Student> optional = studentRepostitory.findById(id);
            return  optional.get();
        }
}

坑一:

时间坑-LocalDateTime反序列化的问题

es bulk更新json 里面的字段_elasticsearch_06

  • 方法二ElasticsearchTemplate 操作ES

操作查询

@RestController
@RequestMapping("/es2")
public class StudentHandler {

    @Autowired
    private ElasticsearchTemplate template;

    //测试查询
    @RequestMapping("/test")
    public List<Student> test() {
        SearchQuery searchQuery = new NativeSearchQueryBuilder()
                .withQuery(QueryBuilders.matchAllQuery()).build();
        return template.queryForList(searchQuery,Student.class);
    }
}

es bulk更新json 里面的字段_es bulk更新json 里面的字段_07


更多方法麻烦大家自己搜索一下。本文演示的是最基本的功能。