您现在的位置是: 首页 > Elasticsearch入门指南


Elasticsearch入门指南

纯真年代 2019-04-17 09:13:48 0 98人围观

你会了解到:

  • 如何下载/运行 Elasticsearch,及其先决条件
  • 通过CRUD REST API 添加,更新,检索和删除数据
  • 基本的文本分析,包括标记和过滤
  • 基本搜索查询
  • 聚合:Elasticsearch 的面向和分析的主功能
ES核心概念

近实时(NRT)
    Elasticsearch是一个近实时搜索平台。这意味着从索引文档到可搜索文档的时间有一点延迟(通常是一秒)。

集群(cluster) 

    ES集群是一个或多个节点(服务器)的集合,它们共同保存你的整个数据,并提供跨所有节点的联合索引和搜索功能。

    群集都是由唯一的一个名称进行标识,默认情况下为“elasticsearch”。节点都是按照名称加入一个集群的。例如,您可以将logging-dev和logging-prod用于开发和生产集群。

节点(node) 
    节点是作为群集总的一个服务器,它存储数据并参与群集的索引和搜索功能。与集群一样,节点由名称标识,默认情况下,该名称是在启动时分配给节点的随机通用唯一标识符(UUID)。你也可以自定义节点名称。此名称对于管理集群非常重要,你可以知道哪些服务器与ES集群中的哪些节点相对应。

    节点可以配置为按照群集的名称加入你的群集。默认情况下,每个节点都设置为加入名为 “elasticsearch” 的集群,这意味着如果的在网络上启动了许多节点并且假设它们可以相互发现 - 它们将自动形成并加入名为“elasticsearch” 的集群。

    在单个群集中,您可以拥有任意数量的节点。此外,如果您的网络上当前没有其他Elasticsearch节点正在运行,则默认情况下启动单个节点将形成名为elasticsearch的新单节点集群。

索引(index) 

    索引就是具有某些类似特征的文档的一个集合。

类型(type)

    在6.0.0版本开始弃用。请参阅删除映射类型

文档(document) 

    文档是可以被索引的基本信息单元。在索引中,你可以根据需要存储任意数量的文档。

分片和复制(shard & replica)  

    索引可能存储大量可能超过单个节点的硬件限制的数据。例如,10亿个文档的索引需要占用1TB磁盘空间,这时,单个节点存储空间可能不够,或者单个节点提供搜索请求可能太慢。为了解决这个问题,Elasticsearch提供了将索引细分为多份,这些就叫分片。

    创建索引时,你可以自定义分片的数量。每个分片本身都是一个功能齐全且独立的“索引”,这些分片可以托管在集群中的任何节点上。分片很重要,主要有两个原因:

  • 1)它允许您水平分割/缩放内容量
  • 2)它允许您跨分片(可能在多个节点上)分布和并行化操作,从而提高性能/吞吐量

分片的分布方式以及如何将文档聚合回搜索请求的机制完全由Elasticsearch管理,对用户来说是透明的。

复制很重要,主要有两个原因:

  • 1)它在碎片/节点出现故障时提供高可用性。因此,请务必注意,副本分片永远不会在与从中复制的原始/主分片相同的节点上分配。
  • 2)它允许您扩展搜索量/吞吐量,因为可以在所有副本上并行执行搜索。

默认情况下,Elasticsearch中的每个索引都分配了一个主分片和一个副本,这意味着如果群集中至少有两个节点,则索引将具有一个主分片和另一个副本分片(一个完整副本),总共两个每个索引的分片。

日常安装 直达车

使用非root账户操作下面步骤

下载  wget https://artifacts.elastic.co/downloads/elasticsearch/elasticsearch-7.0.0-linux-x86_64.tar.gz

解压(目录自己定义)  tar -zxvf elasticsearch-7.0.0 -C /home/yuyong/app/

配置es_home

export ES_HOME=/home/yuyong/app/elasticsearch-6.7.0
export PATH=$PATH:$ES_HOME/bin

启动,bin下面

./elasticsearch

./elasticsearch -Ecluster.name = my_cluster_name -Enode.name = my_node_name

修改配置,由于我es在虚拟机,我windows用postman操作,所以得能远程操作。在config下面的elasticsearch.yml。默认端口是9200



REST API使用

    Elasticsearch提供了一个非常全面和强大的REST API,您可以使用它与集群进行交互。使用API可以完成的一些事项如下:

  • 检查群集,节点和索引运行状况,状态和统计信息
  • 管理您的群集,节点和索引数据和元数据
  • 对索引执行CRUD(创建,读取,更新和删除)和搜索操作
  • 执行高级搜索操作,例如分页,排序,过滤,脚本编写,聚合等等
集群健康与节点

使用 _cat APi

集群健康

GET http://192.168.31.100:9200/_cat/health?v

结果


我们可以看到名为“elasticsearch”的群集处于绿色状态。

每当我们要求群集健康时,我们要么获得绿色,黄色或红色。

  • 绿色 - 一切都很好(集群功能齐全)
  • 黄色 - 所有数据都可用,但尚未分配一些副本(群集功能齐全)
  • 红色 - 某些数据由于某种原因不可用(群集部分功能)

注意:当群集为红色时,它将继续提供来自可用分片的搜索请求,但您可能需要尽快修复它,因为存在未分配的分片。

查询节点

GET http://192.168.31.100:9200/_cat/nodes?v

结果


我们可以看到一个名为“WsVyS1”的节点,它是我们集群中当前的单个节点。  

查看所有索引指数

GET http://192.168.31.100:9200/_cat/indices?v

默认情况下会得到下面回应,是因为没创建索引

health status index uuid pri rep docs.count docs.deleted store.size pri.store.size
创建索引
PUT http://192.168.31.100:9200/customer?pretty

回应,url的pretty参数是让它返回漂亮的格式,其实就是json

{
"acknowledged": true,
"shards_acknowledged": true,
"index": "customer"
}

当我们再次查看所有索引指数

GET http://192.168.31.100:9200/_cat/indices?v

回应


        我们现在有一个名为customer的索引,它有一个主分片和一个副本(默认值),它包含0文档。  

        health为黄色表示某些副本尚未分配。此索引发生这种情况的原因是因为默认情况下Elasticsearch为此索引创建了一个副本。由于我们目前只有一个节点在运行,尚无法分配一个副本(用于高可用性)。如果改集群有两个节点,那么将该副本分配到第二个节点后,此索引的运行状况将变为绿色。  

索引和查询文档

    现在让我们在customer索引中加入一些内容。我们将一个简单的客户文档索引到客户索引中,ID为1,如下所示:  

PUT http://192.168.31.100:9200/customer/_doc/1?pretty
json内容为:
{
"name":"Zhang Shan"
}

回应

{
"_index": "customer",
"_type": "_doc",
"_id": "1",
"_version": 1,
"result": "created",
"_shards": {
"total": 2,
"successful": 1,
"failed": 0
},
"_seq_no": 0,
"_primary_term": 1
}

    值得注意的是,ES创建文档的之前不需要显式的创建索引。在前面的示例中,如果customer索引事先不存在,则ES将自动创建 customer 索引。  

查询索引文档

GET http://192.168.31.100:9200/customer/_doc/1?pretty

回应

{
"_index": "customer",
"_type": "_doc",
"_id": "1",
"_version": 1,
"_seq_no": 0,
"_primary_term": 1,
"found": true,
"_source": {
"name": "Zhang Shan"
}
}
删除索引
DELETE http://192.168.31.100:9200/customer?pretty

回应

{
"acknowledged": true
}
更新索引/替换文档
PUT http://192.168.31.100:9200/customer/_doc/1?pretty

回应

{
"_index": "customer",
"_type": "_doc",
"_id": "1",
"_version": 2,
"result": "updated",//第一次创建时created,第二次就是updated
"_shards": {
"total": 2,
"successful": 1,
"failed": 0
},
"_seq_no": 1,
"_primary_term": 1
}

不指定id进行操作,我们看到上面时带了id=1的,注意这里是POST请求

POST http://192.168.31.100:9200/customer/_doc/?pretty

json内容为:
{
"name":"no id"
}

回应

{
"_index": "customer",
"_type": "_doc",
"_id": "7chYKWoB0xygqtNZL2Um",
"_version": 1,
"result": "created",
"_shards": {
"total": 2,
"successful": 1,
"failed": 0
},
"_seq_no": 0,
"_primary_term": 1
}
更新文档

    每当我们进行更新时,Elasticsearch都会删除旧文档,然后一次性对应用了更新的新文档编制索引。  

POST http://192.168.31.100:9200/customer/_doc/1/_update?pretty
json为:
{
"doc":{
"name":"Jane Doe",
"age": 20
}
}

脚本更新

http://192.168.31.100:9200/customer/_doc/1/_update?pretty
{
"script":"ctx._source.age += 5"
}

ctx._source指的是即将更新的当前源文档。  

    ES提供了在给定查询条件(如SQL UPDATE-WHERE语句)的情况下更新多个文档的功能。请参阅

docs-update-by-query API

删除文档
http://192.168.31.100:9200/customer/_doc/1?pretty

    请参阅_delete_by_query API以删除与特定查询匹配的所有文档。值得注意的是,删除整个索引而不是使用Delete By Query API删除所有文档会更有效。  

批处理
POST http://192.168.31.100:9200/customer/_bulk?pretty

json内容为

{"index":{"_id":"1"}}
{"name": "John Doe" }
{"index":{"_id":"2"}}
{"name": "Jane Doe" }

注意:


相应

{
"took": 13,
"errors": false,
"items": [
{
"index": {
"_index": "customer",
"_type": "_doc",
"_id": "1",
"_version": 4,
"result": "updated",
"_shards": {
"total": 2,
"successful": 1,
"failed": 0
},
"_seq_no": 3,
"_primary_term": 1,
"status": 200
}
},
{
"index": {
"_index": "customer",
"_type": "_doc",
"_id": "2",
"_version": 1,
"result": "created",
"_shards": {
"total": 2,
"successful": 1,
"failed": 0
},
"_seq_no": 4,
"_primary_term": 1,
"status": 201
}
}
]
}

待完...





全部评论