ElasticSearch

180 阅读24分钟

1、ElasticSearch简介

1.1、ElasticSearch是什么

    Elasticsearch 是一个分布式可扩展的实时搜索和分析引擎,一个建立在全文搜索引擎 Apache Lucene基础上的搜索引擎,Elasticsearch 不仅包括了全文搜索功能,还可以进行以下工作:

(1)分布式实时文件存储,并将每一个字段都编入索引,使其可以被搜索。

(2)实时分析的分布式搜索引擎。

(3)可以扩展到上百台服务器,处理PB级别的结构化或非结构化数据。

1.2、基本概念

    Elasticsearch是面向文档型数据库,一条数据在这里就是一个文档,用JSON作为文档序列化的格式。

ElasticSearch和关系型数据术语对照表如下:

关系型数据库(MySQL)非关系型数据库
数据库database索引 index
表 table类型 type
数据行 row文档 document
数据列 column字段 field
     一个 Elasticsearch 集群可以包含多个索引(数据库),也就是说其中包含了很多类型(表)。这些类型中包含了很多的文档(行),然后每个文档中又包含了很多的字段(列)。Elasticsearch的交互,可以使用Java API,也可以直接使用HTTP的Restful API方式,比如我们打算插入一条记录,可以简单发送一个HTTP的请求:
PUT /megacorp/employee/1  
{
    "name" :     "John",
    "sex" :      "Male",
    "age" :      25  
}

1.3、ElasticSearch特点

优点1、可扩展性:只需要增加一台服务器,配置一些信息,启动ES进程即可快速加入集群。
2、分片机制:同一个索引分成多个分片,采取分而治之的思想来更好地解决问题。
3、高可用:提供复制机制,一个分片可以设置多个复制,使得某台服务器宕机能够把丢失的数据恢复到其他节点上。
缺点1、节点数据一致性问题:默认机制通过多播机制同步元数据信息,在较繁忙的集群中可能由于网络阻塞或节点处理能力到达饱和导致各个节点元数据不一致,使集群处于不一致状态。
2、无细粒度的权限管理:没有像MySQL那样的分各种用户,每个用户又有不同的权限。

1.4、解决的问题

(1)更快的在大量数据中检索相关数据,性能远优于传统数据库。

(2)结合分词器,根据关键词返回统计结果。

1.5、应用场景

(1)全文搜索:如淘宝搜索23寸电脑关键词,搜索系统依据关键词分词查询,按照指定的匹配度返回对应的商品。

(2)记录和日志分析:围绕Elasticsearch构建的生态系统使其成为最容易实施和扩展日志记录解决方案之一。结合Logstash、Elasticsearch和Kibana组件,可以搭建一套高效的日志收集和分析系统(ELK)。

(3)数据可视化:Kibana是一款功能强大且易于使用的可视化工具,结合ES对大量数据提供可视化组件。

2、基本原理

2.1、索引

Elasticsearch最关键的就是提供强大的索引能力。

2.1.1、B-Tree索引

    B-tree索引,是一种很普遍的数据库索引结构,oracle默认的索引类型。其特点是定位高效、利用率高、自我平衡,定位单条或小范围数据非常高效。

数据结构

主要特点

(1)树形结构:由根节(root)、分支(branches)、叶(leaves)三级节点组成,其中分支节点可以有多层。

(2)多分支结构:单root/branch可以有多个子节点。

(3)双向链表:整个叶子节点部分是一个双向链表。

(4)单个数据块中包括多条索引记录

2.1.2、倒排索引

假设有如下数据:

IDNameAgeSex
1zhangsan24Female
2lisi24Male
3wangwu29Male

ID为Elasticsearch自建的文档id,Elasticsearch建立的索引如下:

TermPosting List
zhangsan1
lisi2
wangwu3
TermPosting List
24[1,2]
293
TermPosting List
Female1
Male[2,3]

Posting List

    Elasticsearch分别为每个field都建立了一个倒排索引,zhangsan, 24, Female为term,而Posting List就是一个int的数组,存储了所有符合某个term的文档id

通过posting list这种索引方式可以很快进行查找,如要找age=24的同学,可快速定位id为1,2的同学,但是,如果有上千万条记录呢?

Term Dictionary

    Elasticsearch为了能快速找到某个term,将所有的term排个序,二分法查找term,就像通过字典查找一样,这就是Term Dictionary。

Term Index

    B-Tree通过减少磁盘寻道次数来提高查询性能,Elasticsearch也是采用同样的思路,直接通过内存查找term,不读磁盘,但是如果term太多,term dictionary也会很大,放内存不现实,于是有了Term Index,就像字典里的索引页一样,A开头的有哪些term,分别在哪页,可以理解term index是一颗树:

    这棵树不会包含所有的term,它包含的是term的一些前缀。通过term Index可以快速地定位到term dictionary的某个offset,然后从这个位置再往后顺序查找。

    所以term index不需要存下所有的term,而仅仅是他们的一些前缀与Term Dictionary的block之间的映射关系,再结合**FST(Finite State Transducers)的压缩技术**,可以使term index缓存到内存中。从term index查到对应的term dictionary的block位置之后,再去磁盘上找term,大大减少了磁盘随机读的次数。

2.1.3、对比

    ElasticSearch/Lucene的检索相比于oracle快的原因在于oracle只有term dictionary这一层,是以B-Tree排序的方式存储在磁盘上的,检索一个 term 需要若干次的 random access 的磁盘操作。而 Lucene 在 term dictionary 的基础上添加了 term index 来加速检索,term index 以树的形式缓存在内存中。从 term index 查到对应的 term dictionary 的 block 位置之后,再去磁盘上找 term,大大减少了磁盘随机读的次数。

2.1.4、倒排索引数据存储

    建立索引最直接的目的是为了加快检索速度,而为了达到这个目的,那么在不考虑其他因素的情况下,需要占用的空间越少越好,而为了减少占用空间,可能就需要压缩之后再进行存储。

字典树

    以单词AFGCC、AFG、ABP、TAGCC为例,缺点是第二行中的后缀 `FGCC`和 第三列中的 `GCC`其实最后三个字符是重复的,但是这些重复的字符串都单独存储了,并没有被复用,也就是说字典树没有解决后缀共用问题,只解决了前缀共用,所以字典树又被称之为前缀树。当数据量达到一定级别的时候,只共享前缀不共享后缀也会带来很多空间的浪费。

FST压缩

    FST压缩就是除了利用字符串的前缀,同时也将相同的后缀进行利用。

    存储索引,自然有键值对,索引关键字就是`key`,而存储文档的id即是`value`。这个数字代表的id可能是不完整的。下面通过构建上面字典树的FST示例说明。

(1)收到第一个存储索引的键值对AFGCC/5,如图:

    蓝色表示`开始节点`,橙色表示`结束节点`,红色的线代表其后面的节点是一个`Final节点``value`5实际存储在任意一条线都可以(没有存储数字的线上实际是`null`值),最终搜索的时候会把整条线路上所有的数字加起来得到最终的`value`值。,所以一条线上的`value`可能是不完整的,它被拆分成几个数字相加,并且存储在不同的线上。

(2)继续存储第二个索引键值对AFG/10,如图:

    由于10=5+5,前面已经存储了一个5,为了不影响第一个键值对`AFGCC/5`,所以只能把它存储在当前索引`key`所对应的`Final`节点上,因为搜索的时候,如果路过不属于自己的 `Final` 节点上的 `value`,是不会相加的。

(3)再接着存储第三个索引键值对ABP/2,如图:

      因为`ABP`字符串和前面共用了`A`,而`A`对应的`value`52大,只能把5拆分成2+3`A`存储2,而遵循越靠前存储复用的概率越大原则,`F`位置存储3

(4)存储最后一个索引键值对TAGCC/6,如图:

    因为`GCC`这个后缀和前面是共用的,而恰好其之后的线上都没有存储`value`,所以直接把6存储在第一条线上即可。

2.2、集群架构

    在单台ES服务器节点上,随着业务量的发展索引文件慢慢增多,会影响到效率和内存存储问题等。

如果使用ES集群,会将单台服务器节点的索引文件使用分片技术,分布式的存放在多个不同的物理机器上,从而可以实现高可用、容错性等。

ElasticSearch集群节点主要有三种角色:

1、Client Node:主要作为索引跟搜索的路由器。

2、Data Node:主要负责数据存储和查询。

3、Master Node:主要管理集群元数据信息,同步元数据到所有master节点。

2.2.1、分片与副本机制

    索引通常会被分解成不同部分,而这些分布在不同节点的数据就是分片。分片是在ES中所有数据的文件块,也就是数据的最小单元块。ES集群的核心就是对所有分片的分布、索引、路由等操作。

    ES默认为一个索引创建5个主分片,并且分别为每个主分片创建一个副本分片。基于系统可用性的考虑,同一个分片的主分片和副本分片不能位于同一个节点中。如下图,当某一刻Node2宕机,由于数据还有P1和R2还可使用,服务基本不会受影响。

    创建索引时,一个文档先是经过路由规则定位到主分片,在这个主分片上创建索引成功后再发送这个文档到这个分片的副本上创建索引,等副本上创建索引成功后才一起返回成功。

    索引数据全部位于分片中,主分片和副本分片各存储一份。当某个副本分片或者主分片丢失时,需要将丢失的分片在其他节点中的副本全量拷贝这个分片的所有数据到新节点上构造新的分片。而拷贝过程需要一段时间,这段时间之内只能由剩余主副本来承载流量。所以副本处理避免数据丢失,提高数据可靠性的同时,还能分流查询压力,扩展查询能力。

2.2.2、扩容与容错机制

    扩容分为**垂直扩容**和**水平扩容**。垂直扩容指增加单台服务器的CPU、内存大小,磁盘容量,简单来讲就是换更强大的服务器。水平扩容就是增加机器数量,通过集群化部署与分布式的技术手段,构建出强大的计算和存储能力。

    Elastisearch使用水平扩容方案,支撑PB级别的数据规模,并且扩容操作后,每增加新的节点会触发索引分片的重新分配。例如ES集群有2个节点,主分片值设为3,副本分片值设为1,则1个索引有3个主分片(P1,P2,P3),3个副本分片(R1,R2,R3)。当加入一个Node-3节点时,触发Node-1和Node-2的分片进行重新分配,如图所示。

    由于同一个分片的主分片和副分片不能位于同一个节点中,例如分片的总数为6个(3个主分片和3个副分片),那么Node节点数量上限也为6个,这个数据即为**扩容极限**,如果要突破极限,可以通过增大副本的值来实现,这样有更多的副本分片去分担查询请求,占用更多的节点,整个集群的CPU、IO、内存资源更多,整体吞吐量也越高。

    但副本值并不是越大越好,冗余存储占用磁盘资源,副本数越大,有效数据的磁盘利用率就越低,实际生产中,可以根据数据量,并发数等实际需求,在创建索引时合理设置主分片的数量,再调整副本分片的值。

2.2.3、master选举流程

    在ES集群中,存在一个master节点,它的职责多一些,需要管理与维护集群的元数据,索引的创建与删除和节点的增加和删除,它都会收到相应的请求,然后进行相应的数据维护。当这个master宕机了会从其他节点中重新选举一个新的master。

选举流程

    ElasticSearch集群节点后台有一个线程定时ping master节点,超过一定次数没有ping成功之后,重新进行master的选举。

2.2.4、集群脑裂问题

    所谓脑裂问题,就是同一个集群中的不同节点,对于集群的状态有了不一样的理解。

    由于某些节点的失效,部分节点的网络连接会断开,并形成一个与原集群一样名字的集群,这种情况成为集群脑裂现象。这个问题非常危险,因为两个新形成的集群会同时索引和修改集群的数据。

    正常情况下,此集群只会有一个Leader,那么如果机房之间的网络断了之后,两个机房内的节点还是可以相互通信的,如果不考虑过半机制,那么就会出现每个机房内部都将选出一个Leader。

过半机制

    在领导者选举的过程中,如果某台节点获得了**超过半数**的选票,则此节点就可以成为Leader了。过半机制的好处是不需要等待所有的节点都投同一个节点就可以选举出一个Leader,这种做法比较快,故也叫快速领导者算法。

注意:过半机制中需要大于,而不是大于等于。

2.2.5、集群故障转移

(1)健康状态

    集群的健康状况可以通过API查看,集群的健康状态只表明主分片的分配情况,并不代表集群服务的状态,ElasticSearch的集群健康状态包括如下三种:

    **green**:健康状态,指所有主副分片都正常分配。

    **yellow**:指所有主分片都可以正常分配,但有的副本分片未正常分配。

    **red**:有主分片未正常分配。
//查询健康状态
GET _cluster/health

//结果
{
  "cluster_name" : "es-cluster",
  "status" : "yellow",
  "timed_out" : false,
  "number_of_nodes" : 3,
  "number_of_data_nodes" : 3,
  ...
}

(2)故障转移

    在一个集群中有三个节点Node 1,Node 2,Node 3,每个节点含有一个主分片(Pn)和一个副本分片(Rn)如下所示,当Node 2和Node 3发现Node 1无法响应一段时间后会发起Master选举, 如选举出Node 2为新的Master节点,由于主分片P0下线,集群状态变更为red,然后Master发现主分片P0为分配,将R0提升为主分片P0,由于所有主分片都正常分配,但P0和P1的副本分片未分配,集群状态变更为yellow,最后Master为P0和P1产生新的副本R0和R1,集群状态变更为green。

3、ElasticSearch数据流程

    ElasticSearch中的采用主备模式来存储数据,数据的更改只能通过主节点来进行,然后复制到其他节点。写数据需要等待所有的副本数据都写成功才能提交,因此写数据的延迟取决于最慢的那个节点,好处是有n+1个节点,能容忍n个节点挂掉。

3.1、数据写流程

流程:

(1)客户端发送请求到任意一个Node,该Node就是Coordinate Node。

(2)Coordinate Node对文档id进行哈希路由,将请求发送给对应Primary Shard的Data Node。

(3)Primary Shard处理请求,然后将数据同步到Replica Node。

    ElasticSearch默认的路由规则:(_routing的默认值是文档的_id)

    shard_num = hash(routing) % num_primary_shards

(4)待所有Replica Node同步完成后将结果返回给Coordinate Node,Coordinate Node再将结果返回给客户端。

3.2、数据读流程

流程:

(1)客户端发送请求到任意一个Node,该Node就是Coordinate Node。

(2)Coordinate Node对文档id进行哈希路由,将请求转发到对应的Node,此时使用随机轮询算法,在Primary Shard和所有Replica Shard中随机选择一个,以达到读请求的负载均衡。

(3)接收请求的Data Node返回对应的文档给Coordinate Node。

(4)Coordinate Node返回对应的文档给客户端。

3.3、数据更新/删除流程

    数据更新操作也是写操作,但是ElasticSearch中的文档时不可变的,因此不能被删除或者改动以展示其变更。

流程:

(1)客户端发送请求到任意一个Node,该Node就是Coordinate Node。

(2)Coordinate Node对文档id进行哈希路由,将请求发送给对应Primary Shard的Data Node。

(3)在该Data Node上的.del文件中标记该文档已被删除。(Data Node磁盘上每个段都有一个对应的.del文件,当删除请求发送后,文档并没有真的被删除,而是在.del 文件中被标记为删除。该文档依然能匹配查询,但是会在结果中被过滤掉。当段合并时,在.del 文件中被标记为删除的文档将不会被写入新段)

(4)在新的文档被创建时,Elasticsearch 会为该文档指定一个版本号,当执行更新时,旧版本的文档在.del 文件中被标记为删除,新版本的文档被索引到一个新段。旧版本的文档依然能匹配查询,但是会在结果中被过滤掉。

3.4、搜索流程

    ES是一个分布式的存储和检索系统,在存储的时候默认是根据每条记录的_id字段做路由分发的,这意味着ES服务端是准确知道每个文档分布在哪个Shard上的。  
   ES搜索时我们不知道那些document会被匹配到,任何一个shard上都有可能,所以一个search请求必须查询一个索引或多个索引里面的所有shard才能完整的查询到我们想要的结果。  

流程:

(1)搜索请求首先会发送到Client Node(也叫Coordinate Node),Client Node收到搜索请求后会并行请求(广播)所有的Shard。

(2)Shard收到请求后会并行搜索所有Segment,搜索完后会将结果合并返回给Client Node。

(3)Client Node会合并所有Shard的结果,并进行相关排序,最后将排序的结果返回给客户。

3.4、索引文档流程

流程:

(1)索引请求首先会发送到Client Node,Client Node从Master Node中获取Primary Shard所在的Data Node并根据路由规则将请求转发到Data Node。

      ElasticSearch默认的路由规则:(_routing的默认值是文档的_id)

      shard_num = hash(routing) % num_primary_shards

(2)Primary Shard会往Lucene(写入内存)写,写成功后会再写到Translog(事务日志,用于恢复数据)中,然后将请求广播到Replica Shard上进行处理。

(3)当所有的Replica Shard都写成功后则返回给用户成功索引数据。

4、文档处理

4.1、文档冲突

    一般我们在更新文档时,主要的操作流程时:读取文档 -> 修改 -> 提交保存。数据中心等保存的都是最新一次提交的内容。

    正常来说没什么问题,但是如果两个或更多的请求并发修改同一个文档时,很容易产生冲突。如果按照先后顺序,则最后被处理的请求可能覆盖首先被处理的请求作出的操作和变更,从而导致其数据变更丢失(最后被处理的请求也不一定是最后发起的,取决于其网络传输等因素影响)。

在发生并发冲突的时候,我们有常用的两种策略:

(1)悲观锁并发策略:在关系型数据库中,通过阻塞并排队的方式,来避免发生冲突,例如在读取数据行时阻塞,来保证正在修改行数据的请求完成正常操作后,以读取到最新的数据。这种方式的前提假设是数据冲突更有可能发生。

(2)乐观锁并发策略:Elasticsearch 中采用的是乐观锁的并发策略,这种方式的前期假设是数据冲突一般不会发生,从而避免阻塞数据请求。然而,在读和写之间,如果数据发生改变,更新就失败了,然后由程序决定如何进行后续的处理,例如重试更新、使用新数据、或将相关情况报告给用户。

4.2、内部系统版本控制

    Elasticsearch 是分布式的。当文档创建、更新或删除时, 新版本的文档必须复制到集群中的其他节点。Elasticsearch 也是异步和并发的,这意味着这些复制请求被并行发送,并且到达目的地时也许顺序是乱的 。 Elasticsearch 需要一种方法确保文档的旧版本不会覆盖新的版本。

    ElasticSearch中每个文档都有一个_version版本号,当文档被修改时版本号递增。ElasticSearch使用这个_version号来确保变更以正确顺序得到执行。如果旧版本的文档在新版本之后到达,它可以被简单的忽略。 

    通过_version版本方式也可以避免ABA的数据问题,即数据A修改为B后又修改为A
//创建文档
PUT /website/blog/1/_create
{
  "title": "My first blog entry",
  "text":  "Just trying this out..."
}


//获取文档
GET /website/blog/1
结果:
{
  "_index" :   "website",
  "_type" :    "blog",
  "_id" :      "1",
  "_version" : 1,
  "found" :    true,
  "_source" :  {
      "title": "My first blog entry",
      "text":  "Just trying this out..."
  }
}

//更新数据(更新完成后_version为2)
PUT /website/blog/1?version=1 
{
  "title": "My first blog entry",
  "text":  "Starting to get the hang of this..."
}

//当再次执行更新version=1的操作时版本冲突。

4.3、外部系统版本控制

    一个常见的设置是使用其它数据库作为主要的数据存储,使用 Elasticsearch 做数据检索,这意味着主数据库的所有更改发生时都需要被复制到 Elasticsearch,如果多个进程负责这一数据同步,可能遇到并发问题。

   如果主数据库已经有了版本号或一个能作为版本号的字段值比如 timestamp,那么可以在Elasticsearch 中通过增加 version_type=external 到查询字符串的方式重用这些相同的版本号。

    外部版本号的处理方式和内部版本号的处理方式有些不同,Elasticsearch 不是检查当前 _version 和请求中指定的版本号是否相同, 而是检查当前_version 是否 小于 指定的版本号。 如果请求成功,外部的版本号作为文档的新 _version进行存储。如:
POST http://node1:9200/user/_update/1?version=4&version_type=external

5、安装及使用

5.1、环境准备

系统节点名称IP地址
CentOS7node1192.168.81.101
CentOS7node2192.168.81.102
CentOS7node3192.168.81.103

5.2、安装

5.2.1、安装ElasticSearch

1、创建普通用户(ES不能使用root来启动,必须使用普通用户来安装启动)
(1)在三台机器上执行
  useradd czh
  passwd root
(2)为该用户设置更大操作权限
  visudo
  # 在文件中增加两行信息
  czh     ALL=(ALL)       ALL
  czh     ALL=(ALL)       NOPASSWD:ALL
(3)三台机器使用root用户创建es相关用户
  mkdir /usr/local/es
  chown -R czh:root /usr/local/es

2、安装JDK
//ElasticSearch是基于Java开发的Java程序,运行在Jvm中,首先需要安装JDK
yum install -y java-1.8.0-openjdk-devel

3、下载ElasticSearch并解压(地址:https://www.elastic.co/cn/downloads/elasticsearch)
tar -zxvf elasticsearch-7.16.1-linux-x86_64.tar.gz -C /usr/local/es/

4、修改配置文件(使用czh用户)
(1)创建用于存放数据与日志的目录
mkdir -p /usr/local/es/elasticsearch-7.16.1/data
mkdir -p /usr/local/es/elasticsearch-7.16.1/log
vim /usr/local/es/elasticsearch-7.16.1/config/elasticsearch.yml

//配置信息
cluster.name: czh-es                                     #集群名称
node.name: node1                                         #节点名称
path.logs: /usr/local/es/elasticsearch-7.16.1/log        #运行日志存放位子
path.data: /usr/local/es/elasticsearch-7.16.1/data       #子节点数据存放点
network.host: 0.0.0.0                                    #都可以访问
http.port: 9200                                          #端口号
transport.port: 9300                                     #节点间访问端口号
node.data: true                                          #此个节点可以作为数据节点
node.master: true            #此节点可以作为主节点,当主节点挂了被设置为true的节点去竞争
discovery.seed_hosts: ["node1:9300","node2:9300","node3:9300"]
cluster.initial_master_nodes: ["node1","node2","node3"]
bootstrap.system_call_filter: false
bootstrap.memory_lock: false
http.cors.enabled: true
http.cors.allow-origin: "*"


5、修改jvm.option配置文件,调整jvm堆内存大小(使用czh用户修改)
vim /usr/local/es/elasticsearch-7.16.1/config/jvm.options
//配置信息
-Xms2g
-Xmx2g

6、将安装包分发到其他节点并进行相应配置的修改
scp  -r /usr/local/es/elasticsearch-7.16.1/ node2:/usr/local/es/elasticsearch-7.16.1/
scp  -r /usr/local/es/elasticsearch-7.16.1/ node3:/usr/local/es/elasticsearch-7.16.1/

7、ES因为需要大量的创建索引文件,需要大量的打开系统的文件,所以我们需要解除linux系统当中打开
文件最大数目的限制,不然ES启动就会抛错。(使用czh用户修改)
sudo vim /etc/security/limits.conf
//配置信息(注意*不要去掉)
* soft nofile 65536
* hard nofile 131072
* soft nproc 2048
* hard nproc 4096


8、修改普通用户可以创建的最大线程数
sudo vi /etc/security/limits.d/20-nproc.conf
//配置信息(将 * soft nproc 1024 修改为如下)
* soft nproc 4096

9、为普通用户调大虚拟内存
sudo sysctl -w vm.max_map_count=262144

10、启动
nohup /usr/local/es/elasticsearch-7.16.1/bin/elasticsearch > /dev/null 2>&1 &

11、访问页面
http://node1:9200/?pretty
http://node2:9200/?pretty
http://node3:9200/?pretty

5.2.2、安装head插件

//ead插件是一个ES集群的web前端工具,它提供可视化的页面方便用户查看节点信息,对ES进行
//各种操作,如查询、删除、浏览索引等。

1、安装相关依赖包(head插件本质上还是一个nodejs的工程,故需要安装node,用npm来安装依赖的包)
wget https://nodejs.org/dist/v9.3.0/node-v9.3.0-linux-x64.tar.xz
xz -d node-v9.3.0-linux-x64.tar.xz    # 解压包
tar -xf node-v9.3.0-linux-x64.tar     # 解压包
ln -s ~/node-v9.3.0-linux-x64/bin/node /usr/bin/node  # 确定nodejs的bin路径
ln -s ~/node-v9.3.0-linux-x64/bin/npm /usr/bin/npm

2、测试
node -v
npm -v

3、npm加速
npm install -g cnpm --registry=https://registry.npm.taobao.org

4、安装elasticsearch-head
git clone git://github.com/mobz/elasticsearch-head.git
cd /usr/local/es/elasticsearch-head
npm install

5、配置
vim _site/app.js
//修改 localhost为node1
this.base_uri = this.config.base_uri || this.prefs.get("app-base_uri") || 
"http://node1:9200";

vim Gruntfile.js
//修改 增加hostname属性
connect: {
        server: {
                options: {
                        hostname: 'node1',  //添加
                        port: 9100,
                        base: '.',
                        keepalive: true
                }
        }
}

6、配置ElasticSearch的elasticsearch.yml文件
http.cors.enabled: true
http.cors.allow-origin: "*"


7、启动elasticsearch-head
cd /usr/local/es/elasticsearch-head/node_modules/grunt/node_modules/grunt-cli/bin
nohup ./grunt server >/dev/null 2>&1 &

//查看进程是否启动
netstat -ntlp | grep 9100

8、访问浏览器页面
http://node1:9100/

5.2.3、安装IK分词器

1、下载Elasticsearch IK分词器
https://github.com/medcl/elasticsearch-analysis-ik/releases

2、使用创建的用户并在elasticsearch的plugins创建ik目录
mkdir -p /export/server/es/elasticsearch-7.6.1/plugins/ik

3、将下载的ik分词器上传并解压到该目录
unzip elasticsearch-analysis-ik-7.6.1.zip

4、将ik目录分发到每一台服务器
cd /usr/local/es/elasticsearch-7.16.1/plugins
scp -r ik/ node2:$PWD
scp -r ik/ node3:$PWD

5、重启ElasticSearch(三台机器执行)
nohup /usr/local/es/elasticsearch-7.16.1/bin/elasticsearch > /dev/null 2>&1 &

5.3、ES简单使用

    ES使用RESTful接口URL的格式:http://localhost:9200/<index>/<type>/[<id>]。其中index、type是必须提供的。id是可选的,不提供es会自动生成。index、type将信息进行分层,利于管理。index可以理解为数据库;type理解为数据表;id相当于数据库表中记录的主键,是唯一的。

5.3.1、ES的增删改查

//向store索引中添加一些书籍
curl -H "Content-Type: application/json" -XPUT 'http://node1:9200/store/books/1?pretty' \
-d '{
  "title": "Elasticsearch: The Definitive Guide",
  "name" : {
    "first" : "Zachary",
    "last" : "Tong"
  },
  "publish_date":"2021-12-17",
  "price":"49.99"
}'

//加?pretty返回工整的结果

//不加?pretty返回的结果

在Elastichead插件中查看

更改

//覆盖方式
curl -H "Content-Type:application/json" -XPUT 'http://node1:9200/store/books/1?pretty' -d '{
  "title": "Elasticsearch: The Definitive Guide",
  "name" : {
    "first" : "Zachary",
    "last" : "Tong"
  },
  "publish_date":"2021-12-17",
  "price":"99.99"
}'

//_update API的方式
curl -H "Content-Type: application/json" -XPOST 'http://node1:9200/store/books/1/_update?pretty' -d '{
  "doc": {
     "price" : 88.88
  }
}'

查询

//浏览器方式
http://node1:9200/store/book/1?pretty

//curl方式
curl -XGET 'http://node1:9200/store/books/1?pretty'

//通过_source获取指定的字段
curl -XGET 'http://hadoop1:9200/store/books/1?_source=title&pretty'

删除

//删除一个文档
curl -XDELETE 'http://node1:9200/store/books/1?pretty'

ES详细使用(官网):