ElasticSearch杂谈-简介&基本使用

概念

基本介绍

Elasticsearch 有几个核心概念,先理解这些概念将有助于掌握 Elasticsearch。

近实时(Near Realtime / NRT)

Elasticsearch 是一个近实时的搜索平台,从生成文档索引到文档成为可搜索,有一个

轻微的延迟(通常是一秒钟)。
集群(Cluster)
ES 默认就是集群状态,整个集群是一份完整、互备的数据。
集群是一个或多个节点(服务器)的集合。集群中的节点一起存储数据,对外提供搜索功
能。集群由一个唯一的名称标识,该名称默认是“elasticsearch”。集群名称很重要,节点
都是通过集群名称加入集群。
节点(Node)
节点是一个服务器,属于某个集群。节点存储数据,参与集群的索引和搜索功能。与集
群一样,节点也是通过名称来标识的。默认情况下,启动时会分配给节点一个 UUID(全局
惟一标识符)作为名称。如有需要,可以给节点取名,通常取名时应考虑能方便识别和管理。
默认情况下,节点加入名为 elasticsearch 的集群,通过设置节点的集群名,可加入指定集
群。
索引(Index)
索引是具有某种特征的文档集合,相当于一本书的目录。例如,可以为客户数据建立索
引,为订单数据建立另一个索引。索引由名称标识(必须全部为小写),可以使用该名称,对
索引中的文档进行建立索引、搜索、更新和删除等操作。一个集群中,索引数量不受限制。
类似于 rdbms 的 database(5.x), 对于用户来说是一个逻辑数据库,虽然物理上会被
分多个 shard 存放,也可能存放在多个 node 中。 6.x 7.x index 相当于 table
类型(Type)
类似于 rdbms 的 table,但是与其说像 table,其实更像面向对象中的 class , 同一 Json
的格式的数据集合。(6.x 只允许建一个,7.0 被废弃,造成 index 实际相当于 table
级)
文档(Document)
文档是可以建立索引的基本信息单元,相当于书的具体章节。
例如,可以为单个客户创建一个文档,为单个订单创建另一个文档。文档用 JSON
(JavaScript 对象表示法)表示。在索引中,理论上可以存储任意数量的文档。
类似于 rdbms 的 row、面向对象里的 object
字段|属性(Field)
相当于字段、属性
分片与副本(Shards & Replicas)
索引可能存储大量数据,数据量可能超过单个节点的硬件限制。
例如,一个索引包含 10 亿个文档,将占用 1TB 的磁盘空间,单个节点的磁盘放不下。
Elasticsearch 提供了索引分片功能,创建索引时,可以定义所需的分片数量。每个分片本
身都是一个功能齐全,独立的“索引”,可以托管在集群中的任何节点上。
分片之所以重要,主要有 2 个原因:
允许水平切分内容,以便内容可以存储到普通的服务器中
允许跨分片操作(如查询时,查询多个分片),提高性能/吞吐量
分片如何部署、如何跨片搜索完全由 Elasticsearch 管理,对外是透明的。
网络环境随时可能出现故障,如果某个分片/节点由于某种原因离线或消失,那么使用故障
转移机制是非常有用的,强烈建议使用这种机制。为此,Elasticsearch 允许为分片创建副
本。
副本之所以重要,主要有 2 个原因:
在分片/节点失败时提供高可用性。因此,原分片与副本不应放在同一个节点上。
扩展吞吐量,因为可以在所有副本上并行执行搜索。
总而言之,索引可以分片,索引分片可以创建副本。复制后,每个索引将具有主分片与副本
分片。
创建索引时,可以为每个索引定义分片和副本的数量。之后,还可以随时动态更改副本
数量。您可以使用_shrink 和_split api 更改现有索引的分片数量,但动态修改副本数量相当
麻烦,最好还是预先计划好分片数量。
默认情况下,Elasticsearch 中的每个索引分配一个主分片和一个副本( 7.X 之前,默认
是 5 片,副本是 0。7.X 默认改为 1 片,副本为 1 )。如果集群中有两个节点,就可以将索
引主分片部署在一个节点,副本分片放在另一个节点,提高可用性。

概念之间关系图

ElasticSearch杂谈-简介&基本使用_第1张图片

这张图可以展示出 ES 各组件之间的关系,整张表是一个 Cluster,横行是 Nodes,竖
列是 Indices,深绿色方块是 Primary Shards,浅绿色方块是 Replica Shards。
至于单个 Host 上的 Node 数目问题,在硬件资源有限的情况下,一般的做法是一个 Host
只运行一个 ES 进程,也就是一个 Node。例外情况是,由于 ES 内存配置上的特殊要求(JVM
Heap 不能超过 32G),如果你的 Host 特别 NB(16 Core CPU + 128G RAM + SSD 这
种),完全可以在单个 Host 上运行多个 ES 进程以避免硬件资源的浪费。

基本操作

全局操作

查询集群健康情况
GET /_cat/health?v
集群的健康状态有红、黄、绿三个状态:
绿 – 一切正常(集群功能齐全)
黄 – 所有数据可用,但有些副本尚未分配(集群功能完全)
红 – 有些数据不可用(集群部分功能)
查询各个节点状态
GET /_cat/nodes?v

对索引的操作

GET /_cat/indices?v
ES 中会默认存在一些索引
ElasticSearch杂谈-简介&基本使用_第2张图片

创建索引

PUT movie_index?pretty
查询某个索引的分片情况
GET /_cat/shards/movie_index
删除索引
DELETE /movie_index

对文档基本操作

PUT movie_index?pretty

PUT /movie_index/_doc/1
{
  "id": 100,
  "name": "operation red sea",
  "doubanScore": 8.5,
  "actorList": [
    {
      "id": 1,
      "name": "zhang yi"
    },
    {
      "id": 2,
      "name": "hai qing"
    },
    {
      "id": 3,
      "name": "zhang han yu"
    }
  ]
}


PUT /movie_index/_doc/2
{
  "id": 200,
  "name": "operation meigong river",
  "doubanScore": 8,
  "actorList": [
    {
      "id": 3,
      "name": "zhang han yu"
    }
  ]
}


PUT /movie_index/_doc/3
{
  "id": 300,
  "name": "incident red sea",
  "doubanScore": 5,
  "actorList": [
    {
      "id": 4,
      "name": "zhang san feng"
    }
  ]
}

DELETE /movie_index/_doc/3

PUT(幂等性操作)
当我们通过执行 PUT /索引名/类型名/文档 id 命令的添加时候,如果文档 id 已经存在,
那么再次执行上面的命令,ElasticSearch 将替换现有文档。
PUT /movie_index/_doc/2
{
  "id": 300,
  "name": "incident red sea",
  "doubanScore": 5.0,
  "actorList": [
    {
      "id": 4,
      "name": "zhang cuishan"
    }
  ]
}
POST(非幂等性操作)
创建文档时,ID 部分是可选的。如果没有指定,Elasticsearch 将生成一个随机 ID,然
后使用它来引用文档。
POST /movie_index/_update/2
{
    "doc": {
        "name": "zandan"
    }
}

查 

GET /movie_index/_search
{
  "query": {
    "match_all": {}
  }
}

加入ik分词

(把对应ES的ik分词器放在plugins下,分发,重启)

测试

不使用中文分词

GET movie_index/_analyze
{
  "text": "我是中国人"
}

使用中文分词

GET movie_index/_analyze
{
  "analyzer": "ik_smart",
  "text": "我是中国人"
}

别名的使用

对于index添加和移除别名

POST /_aliases
{
  "actions": [
    {
      "add": {
        "index": "movie_index",
        "alias": "movie_chn_query"
      }
    },
    {
      "remove": {
        "index": ".apm-custom-link",
        "alias": "movie_chn_query"
      }
    },
    {
      "add": {
        "index": ".apm-agent-configuration",
        "alias": "movie_chn_query"
      }
    }
  ]
}

别名的使用

GET /movie_chn_query/_search
{
  "query": {
    "match_all": {}
  }
}

别名查看

GET _cat/aliases?v

索引模板

索引模板(Index Template),顾名思义就是创建索引的模具,其中可以定义一系列
规则来帮助我们构建符合特定业务需求的索引的 mappings 和 settings,通过使用索引模
板可以让我们的索引具备可预知的一致性。
创建索引模板
PUT _template/template_movie
{
  "index_patterns": [
    "movie_test*"
  ],
  "settings": {
    "number_of_shards": 1
  },
  "aliases": {
    "{index}-query": {},
    "movie_test-query": {}
  },
  "mappings": {
    "properties": {
      "id": {
        "type": "keyword"
      },
      "movie_name": {
        "type": "text",
        "analyzer": "ik_smart"
      }
    }
  }
}
查看模板
GET _cat/templates
其中 "index_patterns": ["movie_test*"]的含义就是凡是往 movie_test 开头的索引写
入数据时,如果索引不存在,那么 ES 会根据此模板自动建立索引。
在 "aliases" 中用{index}表示,获得真正的创建的索引名。aliases 中会创建两个别名,
一个是根据当前索引创建的,另一个是全局固定的别名。
测试
PUT movie_test_202013/_doc/1
{
 "id":"333",
 "movie_name":"zhang3"
}

如果开始没有创建maping映射,它会按照上面的模板生成

GET movie_test_202013/_mapping

生成的结果为

{
  "movie_test_202013" : {
    "mappings" : {
      "properties" : {
        "id" : {
          "type" : "keyword"
        },
        "movie_name" : {
          "type" : "text",
          "analyzer" : "ik_smart"
        }
      }
    }
  }
}

查看生成的别名

GET movie_test_202013/_alias
{
  "movie_test_202013" : {
    "aliases" : {
      "movie_test-query" : { },
      "movie_test_202013-query" : { }
    }
  }
}

这时候就可以根据别名查询了

GET /movie_test-query/_search
{
  "query": {
    "match_all": {}
  }
}

使用模板的和别名一块用的好处是,在数据量特别大的时候,可以起到和hive一样分区的效果

你可能感兴趣的:(工具篇,大数据)