Elasticsearch介绍

什么是Elasticsearch?

Elasticsearch是对Apache开源库Lucene的封装,提供了RESTful API的操作接口,开箱即用

Elasticsearch是一个分布式实时文件存储,每个字段都被索引并可被搜索

Elasticsearch是一个分布式的实时分析搜索引擎,可以扩展到上百台服务器,处理PB级结构化或非结构化的数据

Elastic Stack

核心是Elasticsearch,提供数据存储;向上是Kibana,提供可视化管理;向下是Beats和Logstash,采集来自应用和基础设施的指标以及从第三方数据存储库中提取数据

Elastic Stack提供一系列企业级解决方案,包括日志、指标、应用性能监控和安全等

ElasticSearch的特点

  • 可扩展
  • 实时
  • 开发者友好
  • 多样的存储
  • 搜索和聚合
  • 倒排索引

Elasticseach基础概念

  • 索引:含有相同属性的文档集合

  • 类型:索引可以定义一个或多个类型,文档必须属于一个类型

  • 文档:可被索引的基本单位

与MySQL的对应关系(参考理解,并不是严格对应,具体有区别):

索引 —— 数据库

类型 —— 表

文档 —— 行

字段 —— 列

RESTful API

发送请求

1
curl -X<VERB> '<PORTOCOL>://<HOST>:<PORT>/<PATH>?<QUERY-STRING>' -d '<BODY>'

VERB——Http方法:GET、POST、PUT、HEAD、DELETE

PROTOCOL——Http或Https协议

HOST——Elasticsearch集群中任何一个节点的主机名,如果在本地就是localhost

PORT——Elasticsearch服务所在端口,默认为9200

PATH——API路径,如-search;PATH可以包含多个组件

QUERTY-STRING——一些可选的查询参数

BODY——一个JSON格式的请求主体

一个简单的请求

1
2
3
4
5
6
curl -XGET 'http://localhost:9200/articles/_count?pretty' -d '
{
"query": {
"match_all": {}
}
}'

这个命令搜索articles索引下的文档个数,在Kibana的控制台中可以简写为:

1
2
3
4
5
6
GET /articles/_count
{
"query": {
"match_all": {}
}
}

Elasticsearch中的文档

Elasticsearch可以面向更为复杂的应用对象,比如包含日期、地理位置、另一个对象或者数组。因为Elasticsearch是面向文档的,意味着它可以存储整个对象或文档,并索引每个文档的内容使之可以被搜索

JSON——Elasticsearch使用JSON作为文档序列化格式

基本的CRUD操作

  • 索引(插入)

    1
    PUT /<index>/_doc/<num> {Body}
  • 搜索

    1
    GET /<index>/_doc/<num>
  • 更新

    1
    POST /<index>/_update/<num> {Body}
  • 删除

    1
    DELETE /<index>/_doc/<num>
  • Bulk API:支持上述四种类型的批量操作,一般包含两行,其中删除操作只需一行

    1
    2
    3
    POST /_bulk
    {"<operation>":{"_index":"<index>","_id":"<id>"}}
    {"<field>":"<value>"}
  • mget:批量读取

    1
    GET /_mget
  • msearch

    1
    POST /<index>/_msearch

Elasticseach的其他特性

  • 分词器分词
  • Mapping(映射)
  • Template
  • 聚合分析(文档相关性算分)
  • ……

Elasticsearch集群

  • 一个节点是一个运行Elasticsearch实例的Java进程
  • 一个集群由一到多个节点共同组成,每个节点担任不同角色
  • 一个主分片是一个Lucene实例,索引部分或全部数据
  • 一个副分片是一个主分片的拷贝
  • 索引是指向同一个或多个物理分片的逻辑命名空间

Elasticsearch的分布式特性

Elasticseach尽可能屏蔽了分布式系统的复杂性,在后台自动提供一些功能

  • 自动分配文档到不同分片中,文档可以存储在一个或多个节点
  • 按集群节点均衡分配分片,从而实现索引和搜索过程的负载均衡
  • 复制分片以实现数据冗余,防止硬件故障带来的数据缺失
  • 基础扩容是无缝整合新节点,重新分配分片

Elasticsearch利用分片将数据分发到集群内的各处。分片是数据的容器,文档保存在分片中,分片又被分配到集群的各个节点中,当集群规模变化时,Elasticsearch自动在各节点中分配迁移分片,使数据均匀分布

SpringBoot继承Elasticseach的几种方式

  • Transport Client(新版本弃用)
  • Jest —— 一个Elasticsearch的Java Http Rest Client

    • 提供Restful API
    • 支持不同版本的Elasticsearch集群
    • 安全——可在Http层添加安全代理
  • Spring Data —— Elasticseach Template

  • Spring Data Elasticsearch Repository —— 对Elasticseach Template的封装