ElasticSearch学习笔记(待更)

版权声明:发扬开源精神,欢迎大家转载对自己有用的文章(●'◡'●) https://blog.csdn.net/jacksonary/article/details/82289418

 Elasticsearch简称ES,官网对它的介绍是

The Heart of the Elastic Stack. Elasticsearch is a distributed, RESTful search and analytics engine capable of solving a growing number of use cases. As the heart of the Elastic Stack, it centrally stores your data so you can discover the expected and uncover the unexpected.

 Elasticsearch是一个高度可扩展的开源全文搜索和分析引擎。它几乎可以提供几乎实时的方式快速存储、搜索和分析大量的数据,它通常用作底层引擎/技术,为具有复杂搜索功能和要求的应用程序提供支持。它是一个分布式、支持Restful搜索以及分析的引擎,是Elastic Stack的核心产品。主要使用场景有:

  • 在线网上商城,提供用户搜索你所卖的商品功能。在这个例子中,你可以使用Elasticsearch去存储你的全部的商品目录和存货清单并且提供搜索和搜索自动完成以及搜索推荐功能。
  • 收集日志或者业务数据,并且去分析并从这些数据中挖掘寻找市场趋势、统计资料、摘要信息或者反常情况。在这个例子中,你可以使用Logstash(part of the Elasticsearch/Logstash/Kibana stack)去收集、聚合并且解析你的数据,然后通过Logstash将数据注入Elasticsearch。一旦数据进入Elasticsearch,你就可以运行搜索和聚集并且从中挖掘任何你感兴趣的数据。
  • 一个价格预警平台,它可以让那些对价格精明的客户指定一个规则,比如:“我相中了一个电子产品,并且我想在下个月任何卖家的这个电子产品的价格低于多少钱的时候提醒我”。在这个例子中,你可以抓取所有卖家的价格,把价格放入Elasticsearch并且使用Elasticsearch的反向搜索(过滤器/抽出器)功能来匹配价格变动以应对用户的查询并最终一旦发现有匹配结果时给用户弹出提示框。
  • 有分析学/商业情报的需求并且想快速审查、分析并使用图像化进行展示,并且在一个很大的数据集上查询点对点的问题(试想有百万或千万的记录)。在这个例子中,你可以使用Elasticsearch去存储你的数据然后使用Kibana(part of the Elasticsearch/Logstash/Kibana stack)去构建定制化的仪表盘。这样你就可以很直观形象的了解对你重要的数据。此外,你可以使用Elasticsearch的集成功能,靠你的数据去展现更加复杂的商业情报查询。

Elasticsearch底层Lucene开源库,其实它就是帮我们写了代码去调用Lucene的接口,提供了REST API的操作接口,JDK版本至少是JDK 8才能安装使用,具体介绍及其使用见官网文档

1. 启动

 启动Elasticsearch:elasticsearch-6.4.0\bin\elasticsearch.bat,可以在DOS窗口看到启动信息,最终会看到类似于下面的一行(主要是节点名[V8JnETy]可能会不同):

[2018-09-01T10:14:11,633][INFO ][o.e.n.Node               ] [V8JnETy] started

在浏览器端访问9200端口(或者直接在powershell中输入curl http://localhost:9200命令),得到一个JSON格式的说明信息:

{
  "name" : "V8JnETy",
  "cluster_name" : "elasticsearch",
  "cluster_uuid" : "Pkr4spGJTMy0K5BQ4rn5GA",
  "version" : {
    "number" : "6.4.0",
    "build_flavor" : "default",
    "build_type" : "zip",
    "build_hash" : "595516e",
    "build_date" : "2018-08-17T23:18:47.308994Z",
    "build_snapshot" : false,
    "lucene_version" : "7.4.0",
    "minimum_wire_compatibility_version" : "5.6.0",
    "minimum_index_compatibility_version" : "5.0.0"
  },
  "tagline" : "You Know, for Search"
}

这里可以手动更改集群cluter和节点名node,命令如下:

./elasticsearch  -Ecluster.name=my_first_cluster -Enode.name=my_first_node

节点名为V8JnETy、集群名字为elasticsearch(默认名),以及版本信息;

默认情况Elasticsearch只允许本机访问,如果需要远程访问,需要配置elasticsearch-6.4.0\config\elasticsearch.yml中的network.host属性(大约在55行处),将其改为network.host: 0.0.0.0,表示任何IP都可以访问,实际开发中会设置为具体的IP。

2. Elasticsearch基本核心概念

 Elasticsearch中具备一些基本的概念,做如下描述:

  • Near Realtime(NRT):ES是几乎是一个实时查询平台,从索引文档到可搜索文档有一点延迟,通常是1秒;
  • Cluster:集群是一个或多个节点(服务器)的集合,它们共同保存整个数据,并提供跨所有节点的联合索引和搜索功能,一般一个集群唯一的名字作标识符(默认是”elatsicsearch”),这个名称很重要,因为如果节点设置为按名称加入群集,则该节点只能是群集的一部分,千万不要在不同的环境中用相同的集群名字,否则很容易导致节点加入错误的集群;
  • Node:节点是组成集群的一个单独服务器,用于存储数据、提供集群索引和搜索功能,和集群一样,节点由名称标识,默认情况下,该名称是在启动时分配给节点的随机通用唯一标识符(UUID),当然这个名字是可以自定义的,节点名称对于管理目的非常重要,可以在其中识别网络中哪些服务器与Elasticsearch集群中的哪些节点相对应。可以通过集群的名字将节点配置进去,默认情况下,每个节点都是被设置加入到一个名字为”elatsicsearch”的集群,这就表示在网络上启动一些节点(假设它们之间可以相互发现),那么它们将会自动形成/加入到名字为elasticsearch的单个集群。在单个群集中,可以拥有任意数量的节点。此外,如果网络上当前没有其他Elasticsearch节点正在运行,则默认情况下,启动单个节点将形成名为elasticsearch的新单节点集群。
  • Index:索引是具有某些类似特征的文档集合,比如拥有客户数据的索引,产品目录的索引以及订单数据的索引。索引由名称标识(必须全部小写),此名称用于在对其中的文档执行索引、搜索、更新和删除操作时引用索引。在单个群集中,可以根据需要定义任意数量的索引。
  • Document:文档(在Elasticsearch中使用JSON的形式表示)是可以编制索引的基本信息单元。例如,可以为单个客户提供文档,为单个产品提供另一个文档,为单个订单再提供另一个文档。在索引Index中,可以根据需要存储任意数量的文档document。请注意,尽管文档实际上驻留在索引中,但实际上必须将文档编入索引/分配给索引中的类型。
  • Shards:索引Index可能存储了超过单个节点的硬件限制的数据。例如,占用1TB磁盘空间的十亿个文档的单个索引可能不适合单个节点的磁盘,或者可能太慢而无法单独从单个节点提供搜索请求。为了解决这样的问题,Elasticsearch提供了将索引细分为多个称为碎片(Shards)的功能,创建索引的时候就可以自定义碎片shards的数量,这些碎片shards本身都是功能齐全、可以托管到集群中任何节点的独立索引(index)。碎片的分布方式和如何将其文档聚合回搜索请求都是完全由Elasticsearch管理的并且这些都是对用户透明的,分片(将索引分为一些碎片)最主要的原因有两个:
    • 允许平行拆分/模块化内容容量;
    • 允许跨分片(这些碎片可能在多个节点上)分布和并行化操作,从而提高性能/吞吐量;
  • Replicas:在网络/云端环境中,故障可能随时发生,为了避免某些碎片shards或者节点node由于某些原因脱机或者消失,强烈推荐使用故障转移机制。为此,Elasticsearch允许将索引的分片shards的一个或多个副本制作成所谓的副本分片replica shards或简称副本replicas。副本replicas重要的原因有两个:
    • 在碎片或节点挂掉时可以提供高度可用性。注意,碎片副本从来都不会被分配在源碎片所在的节点上(要挂一起挂,我还要副本干嘛( ఠൠఠ )ノ);
    • 由于搜索可以在所有副本上并行执行,所以它扩展了搜索性能和吞吐量。

【总结】

每个索引index可以分割为许多碎片shards,当然这些索引可以有0个或多个副本,一旦索引有了副本,那就有了主碎片shards和副本碎片replica shards了。这些碎片shards和副本replicas的数量在索引被创建时就可以被定义出来,当然副本数量可以在索引创建后动态进行更改。虽然可以通过_shrink_split接口对索引index的碎片shards数量进行更改,但是提前计划好碎片shards的数量是最好的方式,也是非常重要的。默认情况下,Elasticsearch中的每个索引index都被分了5个主碎片shards和1个副本replica,那就表示如果群集中至少有两个节点,则索引将包含5个主分片和另外5个副本分片(1个完整副本),每个索引总共有10个分片。

【注意】 每个Elasticsearch碎片shards都是Lucene中的一个索引index,对于一个Lucene索引index所含的文档documents数量通常都是有一个最大值,比如LUCENE-5843,极限值是2,147,483,519 (= Integer.MAX_VALUE - 128),另外,可以通过_cat/shards接口监控碎片shards的体积。Type属性在Elasticsearch 6.x.x已经被弃用,所以这里不提了。

3. 基本操作

 Elasticsearch提供强大支持Rest风格的API,可以完成下面的一些操作(仅是部分):

  • 检查集群cluster、节点node和索引index的运行状态和统计信息;
  • 管理集群、节点和索引数据以及元数据;
  • 执行CRUD以及针对索引的搜索操作;
  • 执行高级搜索操作,例如分页,排序,过滤,脚本编写,聚合等等;

3.1 Cluster Health

 健康检查可以让给我们看到集群当前正在做的事情,正常可以通过curl来干这事儿,当然可以使用任意工具(只要能执行HTTP/REST请求即可),命令为curl -X GET "localhost:9200/_cat/health?v"。使用_catAPI接口进行健康检查,比如:

C:\Users\liuwg-a\Desktop\curl-7.61.0_4-win64-mingw\curl-7.61.0-win64-mingw\bin>curl -X GET "localhost:9200/_cat/health?v"
epoch      timestamp cluster       status node.total node.data shards pri relo init unassign pending_tasks max_task_wait_time active_shards_percent
1535783031 14:23:51  elasticsearch green           1         1      0   0    0    0        0             0                  -                100.0%

【注意】这里记录一个坑,win10的powershell自带的curl应该是阉割版的,只能进行很简单的访问,没法带参,所以还是自己去下载一个win平台下的curl,配置教程这里就不写了。

猜你喜欢

转载自blog.csdn.net/jacksonary/article/details/82289418