ElasticSearch概念、原理、实践、应用

[复制链接]
查看1947 | 回复0 | 2021-12-8 01:29:05 | 显示全部楼层 |阅读模式
目录; n+ u; ]; k2 p  I2 r3 d) V

, P1 K$ D1 z* F! A一、ElasticSearch是什么?
1 k7 t- {: O8 ?7 T二、ElasticSearch基本概念- N7 {( X# f; `3 y% B. ^

    5 n1 e! H5 ^" e6 b: ^. z
  • 1. 全文搜索(Full-text Search), N3 T) N$ j6 u
  • 2. NRT7 E7 ~+ e7 N/ s" m! p* p0 _
  • 3. Cluster
    0 X2 n- r, p5 _$ j/ H
  • 4. Node
    9 f( H! M4 l& J% c: P8 g
  • 5. shard
    : W) ]/ W3 G- k4 \# t3 H! G/ e2 z
  • 6. replica1 |) G4 o9 T2 I) u. b
  • 7. 节点 & 集群(Node & Cluster)
    ) w- w/ B: F  o: t: h; |1 [& H
  • 8. 索引(Index)
    0 u; k$ E! [, c
  • 9. 文档(Document)) o  h( I' R& X+ Q6 U
  • 10. 类型(Type)
    9 v9 w2 ?& |( D4 R
  • 11. 文档元数据(Document metadata)0 W# q5 E4 D3 P. ^+ j# p8 a
  • 12. 字段(Fields)
    . W* q" G; v3 O3 `  c  u
三、ElastichSearch核心概念 - 详细看附录7
% |0 P. S( d* @) f1. 倒排索引(Inverted Index)
* q8 Q/ n! R4 _5 E2. ES集群架构
: X  u! D9 |! `& l; I3. ES发现机制
/ L+ D7 i0 b7 _: I/ b+ ]" v
    3 Q, f) e' S/ p
  • 3.1 分布式以及 Elastic
    3 x) e- {' r) a/ l5 N% I! t
  • 3.2 分片(Shard)以及副本(Replica)% m3 `  x9 z& \
  • 3.3 恢复以及容灾
    5 }0 P0 _* q1 r9 x
  • 3.4 选主. {8 n4 v, h% E+ H9 T
  • 3.5 脑裂2 m" ?) `. J$ z* P5 X' [
4. ES存储机制
4 [. k3 A+ w  e1 |! F
    0 ~% w* Q1 N  G, ^
  • 4.1 简单的文件系统存储2 R: S9 B% R7 _- n; i% o4 n
  • 4.2 MMap文件系统存储' u6 F4 U  ]2 Z0 g1 k1 ^* N6 R
  • 4.3 内存存储. h* o; [2 v6 F. F5 X8 \, ^/ ?$ b
  • 4.4 默认存储类型
    ! G; M  N% {& x
5. ES恢复机制% U' E( u. E# k; t
6. 索引写入, c& z% G6 L. g
四、ElasticSearch基本使用 - 观看附录2* U& h$ ^; o+ t, z/ C& Z: N' u
五、ElasticSearch应用场景9 k/ Z3 H  n. V/ o" Y! x4 E
六、ElasticSearch面试题 -- 答案附录4* W, e2 P1 A- D' Z, T$ P
七、ElasticStack -- 参考附录3
& g0 B5 ~( ^! \6 P/ a9 f6 I## 一、ElasticSearch是什么?
& I* \( A+ J" Q" y  k, n$ s$ b8 N# ]4 @

2 P1 l+ Y. Z$ t0 X* I+ k6 M$ h0 o: i6 y% ^- w  v' I- v

$ x  f2 ?% |8 n" v/ R- `# c: e
$ z% S; G: o; O. Q7 p! y
Elasticsearch是一个开源的分布式、RESTful 风格的搜索和数据分析引擎,它的底层是开源库Apache Lucene。& b) q9 I, a6 k- O  \2 M! Y7 r
Lucene 可以说是当下最先进、高性能、全功能的搜索引擎库——无论是开源还是私有,但它也仅仅只是一个库。为了充分发挥其功能,你需要使用 Java 并将 Lucene 直接集成到应用程序中。 更糟糕的是,您可能需要获得信息检索学位才能了解其工作原理,因为Lucene 非常复杂。' y* ?2 Q: |  R0 u$ ~0 Z& u
为了解决Lucene使用时的繁复性,于是Elasticsearch便应运而生。它使用 Java 编写,内部采用 Lucene 做索引与搜索,但是它的目标是使全文检索变得更简单,简单来说,就是对Lucene 做了一层封装,它提供了一套简单一致的 RESTful API 来帮助我们实现存储和检索。& Q# b4 P: T9 ], Z
当然,Elasticsearch 不仅仅是 Lucene,并且也不仅仅只是一个全文搜索引擎。 它可以被下面这样准确地形容:
" W; x4 _5 c7 l

    - m. Y, q9 j; H8 }- _7 c
  • 1. 一个分布式的实时文档存储,每个字段可以被索引与搜索;) T* D1 ]8 }( S6 M
  • 2. 一个分布式实时分析搜索引擎;
    4 b# x3 c( Q3 L" Q. S! n& x9 T  w
  • 3. 能胜任上百个服务节点的扩展,并支持 PB 级别的结构化或者非结构化数据。
    3 @! f# b! Q" L9 P( R- Q4 r1 d
## 二、ElasticSearch基本概念
$ H- T5 T% _9 o" P1 m; p- h
0 P7 e; [: D- G3 d5 ]### 1. 全文搜索(Full-text Search)9 |, k7 \& t: L9 H1 v# a

  S. K& D+ K" W' P- z& |全文检索是指计算机索引程序通过扫描文章中的每一个词,对每一个词建立一个索引,指明该词在文章中出现的次数和位置,当用户查询时,检索程序就根据事先建立的索引进行查找,并将查找的结果反馈给用户的检索方式。% N& L3 x$ \, t+ s! Z; Z
在全文搜索的世界中,存在着几个庞大的帝国,也就是主流工具,主要有:
; ~2 N/ `1 v2 T/ a# e/ T# @: Y, z# ~
    ' s' h. F+ ?  \4 y4 H
  • 1. Apache Lucene* ~* a! Q( N$ e) L  w% L$ t( [
  • 2. Elasticsearch
    $ P7 o4 i; E, C( c) R
  • 3. Solr
    7 A4 [$ S$ y1 D6 }1 E( s/ {5 J
  • 4. Ferret; O* C3 M, U. \9 @; x
### 2. NRT
& D) F) I- g: O/ ^% R7 |6 B& |5 W+ t- r, Q
Near Realtime,近实时,有两个层面的含义,一是从写入一条数据到这条数据可以被搜索,有一段非常小的延迟(大约1秒左右),二是基于Elasticsearch的搜索和分析操作,耗时可以达到秒级。
- U. v) `$ D' v. f5 B. d% K  l### 3. Cluster# i, t5 v# `% |  m. ]6 T3 b

3 T" Z* g  T, j9 P( s4 y集群,对外提供索引和搜索的服务,包含一个或多个节点,每个节点属于哪个集群是通过集群名称来决定的(默认名称是elasticsearch),集群名称搞错了后果很严重。命名建议是研发、测试环境、准生产、生产环境用不同的名称增加区分度,例如研发使用es-dev,测试使用es-test,准生产使用es-stg,生产环境使用es-pro这样的名字来区分。如果是中小型应用,集群可以只有一个节点。
* z* P+ _! b' a& e7 ?### 4. Node
! z# u3 f  Y0 J7 u" ^$ c1 M0 M& F3 \" u
单独一个Elasticsearch服务器实例称为一个node,node是集群的一部分,每个node有独立的名称,默认是启动时获取一个UUID作为名称,也可以自行配置,node名称特别重要,Elasticsearch集群是通过node名称进行管理和通信的,一个node只能加入一个Elasticsearch集群当中,集群提供完整的数据存储,索引和搜索的功能,它下面的每个node分摊上述功能(每条数据都会索引到node上)。
7 _$ K4 T0 e7 r) }### 5. shard
1 c/ f. z7 z$ u' ?5 N
" G( @1 k, X3 a分片,是单个Lucene索引,由于单台机器的存储容量是有限的(如1TB),而Elasticsearch索引的数据可能特别大(PB级别,并且30GB/天的写入量),单台机器无法存储全部数据,就需要将索引中的数据切分为多个shard,分布在多台服务器上存储。利用shard可以很好地进行横向扩展,存储更多数据,让搜索和分析等操作分布到多台服务器上去执行,提升集群整体的吞吐量和性能。
* ]3 |3 x% n( ?* \  B) mshard在使用时比较简单,只需要在创建索引时指定shard的数量即可,剩下的都交给Elasticsearch来完成,只是创建索引时一旦指定shard数量,后期就不能再更改了。# I, r  n  }' ]" N& J
### 6. replica
" r( n1 D( \6 k# ]& U
. B, D# `" E# Y% I3 `( }& g索引副本,完全拷贝shard的内容,shard与replica的关系可以是一对多,同一个shard可以有一个或多个replica,并且同一个shard下的replica数据完全一样,replica作为shard的数据拷贝,承担以下三个任务:# n- C+ a- K  v1 t: m

    / z7 i* r: G7 b& Y) o8 v% u
  • 1. shard故障或宕机时,其中一个replica可以升级成shard。1 L" ^: ^$ S+ {/ F) s- u3 i& E
  • 2. replica保证数据不丢失(冗余机制),保证高可用。: T' @, q9 ~, J# z
  • 3. replica可以分担搜索请求,提升整个集群的吞吐量和性能。& F& Z/ S; |  c4 |( J3 M
shard的全称叫primary shard,replica全称叫replica shard,primary shard数量在创建索引时指定,后期不能修改,replica shard后期可以修改。默认每个索引的primary shard值为5,replica shard值为1,含义是5个primary shard,5个replica shard,共10个shard。
! j) O0 \, K9 W$ q% @2 H7 P因此Elasticsearch最小的高可用配置是2台服务器。
- L* ~, Z. s" g3 i" V$ B: `### 7. 节点 & 集群(Node & Cluster)+ x* v. b4 @$ ^2 p6 l3 o

$ g4 ?, F& h* J9 u- ~Elasticsearch 本质上是一个分布式数据库,允许多台服务器协同工作,每台服务器可以运行多个Elasticsearch实例。单个Elasticsearch实例称为一个节点(Node),一组节点构成一个集群(Cluster)。6 p7 Z: \0 t4 v/ z
### 8. 索引(Index)" s0 z5 i5 q( R4 V& A% n5 ~
) y' p4 a2 Q- V7 [0 }/ M6 b! v
Elasticsearch 数据管理的顶层单位就叫做 Index(索引),相当于关系型数据库里的数据库的概念。另外,每个Index的名字必须是小写。
& O; `6 c, d2 K' d4 Z) ~### 9. 文档(Document)
# s$ j7 O  w/ k6 Y  G( T3 Z/ E' `% l  F% k' V6 w+ a) D$ V
Index里面单条的记录称为 Document(文档)。许多条 Document 构成了一个 Index。Document 使用 JSON 格式表示。同一个 Index 里面的 Document,不要求有相同的结构(scheme),但是最好保持相同,这样有利于提高搜索效率。
& G) ?! k3 V4 c( Z$ W; K0 l9 h### 10. 类型(Type)9 v( N. ]+ J( h# b3 r/ g/ d# }
4 \7 R9 C& s6 F$ E
1. Document 可以分组,比如employee这个 Index 里面,可以按部门分组,也可以按职级分组。这种分组就叫做 Type,它是虚拟的逻辑分组,用来过滤 Document,类似关系型数据库中的数据表。( [- [4 P/ |& e% ]
2. 不同的 Type 应该有相似的结构(Schema),性质完全不同的数据(比如 products 和 logs)应该存成两个 Index,而不是一个 Index 里面的两个 Type(虽然可以做到)。8 R! |8 {& A1 ]* }: t
### 11. 文档元数据(Document metadata), v2 F/ X; l- d  c* {

3 |! C0 |& K8 h1 i文档元数据为_index, _type, _id, 这三者可以唯一表示一个文档,_index表示文档在哪存放,_type表示文档的对象类别,_id为文档的唯一标识。
+ l7 R$ N2 s, V- j/ E% ~6 ~8 m' b: T### 12. 字段(Fields)
* }8 w5 D. @# m- d6 X
; l8 h- V  R+ _" d1. 每个Document都类似一个JSON结构,它包含了许多字段,每个字段都有其对应的值,多个字段组成了一个 Document,可以类比关系型数据库数据表中的字段。
" g3 `9 x& q- H( \: e& Y  V3 ~+ v2 y2. 在 Elasticsearch 中,文档(Document)归属于一种类型(Type),而这些类型存在于索引(Index)中,下图展示了Elasticsearch与传统关系型数据库的类比:
0 _6 Y# u1 b, j7 P## 三、ElastichSearch核心概念 - 详细看附录7: H: h! {2 f5 e: g

" }+ |* ]* G4 T4 m  |, p! h* _### 1. 倒排索引(Inverted Index)
0 e& i, i' Z9 x0 w5 c& |5 |
( r. s0 K3 x7 k7 U, M该索引表中的每一项都包括一个属性值和具有该属性值的各记录的地址。由于不是由记录来确定属性值,而是由属性值来确定记录的位置,因而称为倒排索引(inverted index)。Elasticsearch能够实现快速、高效的搜索功能,正是基于倒排索引原理。
. r* I3 \2 o2 \5 e8 s  D& ~, o
8 A' c8 }/ g  A9 T% z2 w2 b; {# z8 p7 e& W
6 {+ Z8 j' d0 W# e' Q( H/ E
0 g& E2 D2 `5 F( p9 U9 {

, E- R& [! p. k7 H7 S( a
2 e9 Q' F: _/ B6 O倒排索引的组成:2 |! e' E% `! J9 [) A
    ; p3 g: `  y0 H% _, |5 ?
  • 1. 单词词典(Term Dictionary)
    ! c8 S0 M. b, @
  • 2. 倒排列表(Posting List), M$ J; Y: o2 @! r
我们知道了词典和倒排文件是Lucene的两种基本数据结构,但是它们的存储方式截然不同,词典存储在内存中,倒排文件在磁盘上。  t+ Z+ ^. |6 V, b2 P1 u9 ]+ y
### 2. ES集群架构- W- [5 q& {) e1 J& T
; h+ n0 [3 `( W/ [* z
, x% x8 v1 K; y* ]3 b
5 C, Z! @( D! V! _7 d8 Z6 a
2 N* t! a( k( ^8 C

( m2 Z" d9 t5 }' a0 B% d7 N一个ES集群可以有多个节点构成,一个节点就是一个ES服务实例,通过配置集群名称cluster.name加入集群。节点为什么用过配置就能加入到集群中呢?我们来探究一下:
$ p: }0 T0 I8 G% ]( Y$ kES中节点有角色的区分,角色的区分是在conf/elasticsearch.yml中的配置来决定的* ^4 \9 @, I' Y; |5 ?9 Y
1. node.master: true/false 2. node.data: true/false集群中的单个节点既可以是候选主节点也可以是数据节点,两两组合会有四种分类:% J) `$ I+ J/ T$ P9 S

    # r- E! J: v$ I! x$ {5 B1 M, u2 a, ]
  • 1. 仅为候选主节点
    ! p7 a2 u# w, j$ w4 c7 N
  • 2. 仅为数据节点2 ^, a- d9 D2 W) y: ]( b% d+ v
  • 3. 既是候选主节点也是数据节点, ~. X; S! A5 @. B7 P& X7 I
  • 4. 既不是候选主节点也不是数据节点. ~9 F% p$ F; z: h
主节点" Y+ }" N+ r) U& |; h- t! k
主节点负责索引的添加、删除,监控哪些节点是集群的一部分,对分片进行分配、收集集群中各个节点的状态等,稳定的主节点对集群的健康非常重要。# p! h3 M$ \' Z* O! B& j: c0 E$ z+ v
候选主节点" B3 [/ k! _; @, p
当主节点死掉,只有候选主节点才能参与选举投票产生,也就是说候选主节点才可以被选举为主节点。
! j( x1 l5 c# Q9 d: [! Y数据节点1 y3 V0 m( @$ G+ Y
数据节点主要负责对数据的增删改查聚合等操作,数据的查询以及存储都是由数据节点负责的,涉及到数据节点的,必须对机器的CPU、IO和内存有着相对高的要求。4 l* M6 c5 r" E% N
协调节点
) P5 @# e! h! W还有一种节点--协调节点,其本身不是通过设置来分配的,用户的请求可以随机发往任何一个节点,并由该节点负责分发请求、收集结果等一系列操作,而不需要主节点的转发。这种节点称之为协调节点。集群中任意节点都充当着协调节点的角色,节点之间也相互保持着联系。. q& z1 I# ~+ j' I2 X! ?$ D3 s
4 p: O' v' b2 o8 a% I

" c9 S% _; x$ e( Q7 |$ `' F7 k: s+ S3 G) D

$ f6 c) D9 \. E* d) w
3 R7 b* }5 f9 s/ h
7 C5 q/ k1 M$ v- J### 3. ES发现机制% M& T9 x8 _) J0 r

$ Z2 a2 d+ _; b, Y7 g该模块主要负责集群中节点的自动发现和Master节点的选举。节点之间使用p2p的方式进行直接通信,不存在单点故障的问题。Elasticsearch中,Master节点维护集群的全局状态,比如节点加入和离开时进行shard的重新分配。 自动发现机制在目前版本(1.3.1)提供了四种选择,一种是默认实现,其他都是通过插件实现。' F, x7 R+ H9 _+ N
    1 B6 k6 ^+ e% B; S' \7 q8 C
  • 1. Azure discovery 插件方式,多播
    " R6 I6 R' B9 G: ~0 \8 d
  • 2. EC2 discovery 插件方式,多播
    " N7 {( j; H" H# B* n. g3 M/ x
  • 3. Google Compute Engine (GCE)discovery 插件方式多播  n8 o. ?8 T3 D; `8 a  l- J
  • 4. zen discovery默认实现 多播/单播
    / ~+ C0 s, \6 y0 X; r
多播也叫组播,指一个节点可以向多台机器发送请求。生产环境中ES不建议使用这种方式,对于一个大规模的集群,组播会产生大量不必要的通信。
9 E) b% f+ n7 Z单播,当一个节点加入一个现有集群,或者组建一个新的集群时,请求发送到一台机器。当一个节点联系到单播列表中的成员时,它就会得到整个集群所有节点的状态,然后它会联系Master节点,并加入集群。5 |3 D5 L5 P# y

  J: }+ \4 M1 W) Z
( f  r0 V0 E8 ]
#### 3.1 分布式以及 Elastic
0 U* ?/ T- l1 h0 c7 D' B8 U$ `; d4 `! _7 j! U9 l- K8 M: B
弹性伸缩 Elastic
; s. {/ Q7 ~* ~% K$ \  ^# TElasticsearch 的弹性体现在两个方面:0 G; T& T5 R6 l* e- ?+ R
1. 服务发现机制让节点很容易加入和退出。- I+ C3 r( r' G0 {
2. 丰富的设置以及allocation API。
" K+ `  t; Y$ i9 n: {#### 3.2 分片(Shard)以及副本(Replica)
3 r8 k1 Y% [! J  g! k  \' a6 E, Q3 F9 E9 ]. {
#### 3.3 恢复以及容灾
4 i) V1 ^3 p6 [+ v/ u7 h; [& m) q+ \0 Q$ J: a+ a& d
#### 3.4 选主
$ p! `* Y5 ~9 q+ B$ @6 f8 Z; ?' }
#### 3.5 脑裂4 E9 H/ ?: H" r# P# J6 s6 d9 D3 Q
# F. b: X  C* H" U7 x6 O
1. 网络问题: ~$ r, ]7 |: q: m; O' S
2. 节点负载4 A2 }' x' g* e. F0 g) J
3. 内存回收
# B* R7 i9 V" G+ k5 p### 4. ES存储机制9 O2 N+ l' S2 ]

5 {; V& d& S/ T
: U5 z3 h1 g2 B/ t
#### 4.1 简单的文件系统存储
5 @# b7 P9 L0 E5 M" j: S! k- }9 p9 M$ w( y  X+ a$ \% j
directory类对外最简单的实现基于文件的随机读写,对于简单的应用来说,这种实现方式足够了。它主要的瓶颈是在文件的多线程存取时性能很差。在ElasticSearch中,通常建议使用基于新IO的系统存储来替代简单的文件系统存储。只是如果用户希望使用简单的文件系统存储,可以设置index.store.type属性值为simplefs。
3 q1 i7 l  X* O9 L新IO文件系统存储
: M7 L0 \5 h  _5 P% b* V! E这种存储类型使用的directory类是基于java.nio包中的FileChannel类实现的,该类映射到Apache Lucene的NIOFSDirectory类这种实现方式使得多个线程同时读写文件时不会出现性能下降的问题。通过设置index.store.type属性值为niofs使用该存储类型。. A( o0 h2 w! R$ G" m$ J
#### 4.2 MMap文件系统存储/ k- s+ f5 x) h1 r1 Y
$ R. y. ~/ c4 f8 f1 P. j2 j, a1 Z
它使用mmap系统调用来通过读取和随机方式完成写文件操作。在进程中,它将文件映射到相同尺寸的虚拟内存地址空间中。由于没有任何的锁操作,多线程存取索引文件时就程序就具有可伸缩性了(可伸缩性是指当增加计算资源时,程序的吞吐量或者处理能力相应的增加)。当我们使用mmap读取索引文件,在操作系统看来,该文件已经被缓存(文件会被映射到虚拟内存中)。基于这个原因,从Lucene索引中读取一个文件时,文件不必加载到操作系统的缓存中,读取速度就会快一些。这基本上就是允许Lucene,也就是ElasticSearch直接操作I/O缓存,索引文件的存取当然会快很多。; @$ f# j1 w: _! ~  t4 X
#### 4.3 内存存储
5 N* ~, S, M  ^; U/ R" M  q: ~  v
这种存储类型是几种类型中唯一不基于Apache Lucene directory实现的(当然也可以用Lucene的RAMDirectory类来实现)。内存存储类型允许用户直接把索引数据存储到内存中,所以硬盘上不会存储索引数据。记住这一点至关重要,因为这意味着数据并没有持久化:只要整个集群重启,数据就会丢失。然而,如果你的应用需要一个微型的、存取快速的,能有多个片分和分片副本的而且重建过程很快的索引,内存存储类型可能是你需要的。把index.store.type属性值设置为memeory即可使用该存储类型。
7 A( _) H9 \* s* U" E存储在内存中的索引数据,与其它存储类型相似,也会在允许存数据的节点上保留分片副本。
# A$ W; G( z) i  B" X#### 4.4 默认存储类型6 F' g: N6 H% {5 ^8 B9 H

; W( Z8 F4 i5 ^. w2 z" R. Y! ?默认情况下,ElasticSearch会使用基于文件系统的存储。尽管不同的存储类型用于不同的操作系统,被选定的存储类型依然基于文件系统。' d6 m0 J; h2 N) e
### 5. ES恢复机制/ x0 M' A9 Q) j. K% K

( ^9 T' n: ]  \$ A7 z

5 o! E6 h1 ?8 B/ E" E* q  a  F: `
1. cluster-level 恢复机制的配置
1 u" T* q/ r1 ~& \' ^, U2. index-level 恢复机制的配置% v+ S/ k: G6 q5 P+ K' H) g7 O
### 6. 索引写入
- D! A( R, t( [% G' M9 {: ]* G$ l/ y: k# L6 u
1. 分片
; e( c4 J4 U: _1 g) P2. 副本
9 \' N. B2 h/ ^" G! Z; F6 A; A; n! A* n, ^8 [1 j# K/ Z

" o) n! b: B& ~( r" o3. ES写索引流程
7 z6 d. f' l* o" ~9 R
7 g) K/ l! x$ g* G# P

4 U0 T/ T. L+ T2 a+ d4. 存储原理
1 ^% L. F$ C$ X* {7 w
- X! n( s. }4 ~! e3 B
7 O2 X$ G1 ?- H, B. l# ~  x
5. 索引文件分段存储并且不可修改,那么新增、更新和删除如何处理呢?
2 ~* f' o# G) U% h2 w# C6. 段合并
* z, I( q; q; O2 E2 f8 S6 t( L3 ]
- R4 }; U% Q5 l6 N$ j( Z) b

& m- Y" i# F; R  N' x## 四、ElasticSearch基本使用 - 观看附录2
4 f/ `: r4 N& S" _/ _: `* K
2 p/ G  i4 Q. Y; A/ a1 j6 z. E### 慕课网视频摘要, M! S2 ^  Z+ _9 ?; q) X0 p5 W' i
1. 安装" \  n! g  x3 |
    & p' Y0 }* `" ?% w2 D  I
  • 1. 但实例安装
    ) A- M7 P4 L4 l5 ?. D2 e* {
  • 2. 插件安装
      g) d9 X9 A4 K' o+ b7 |4 v7 ^; \  _' b
  • 3. 分布式安装
    8 ?3 u8 a  n6 y- F: ]& z
2. 基本用法. T2 s( t( M$ O

    - H. P" X. A5 r; l
  • 1. 索引创建3 P. g) X  N( [& b6 L6 u
  • 2. 插入
    $ H7 Q9 |* _) g! K( n! _
  • 3. 修改( a+ h+ Q0 T7 o, v/ q/ e1 ]0 l
  • 4. 删除+ I6 T6 l% \- [6 x4 K5 B; `5 a
  • 5. 查询
    8 K& }5 |- A6 z% ?) W
3. 高级查询
: {+ d; [( M( O  Q

    2 p, n# U& h; j6 q
  • 1. query, q1 D1 y( ]" i1 }& X
  • 2. filter6 s7 S4 l  ~3 ]1 _( T" c
  • 3. 复合查询. H9 y) G6 {% q& k: J7 N  z$ K, j* k
4. Spring Boot 继承ES2 j, D# ?$ X% M. v, Z7 o
## 五、ElasticSearch应用场景
& l& n$ l8 I1 Q' ]7 x: O7 h& a1 F4 y0 H, V# S
(1)维基百科和百度百科,手机维基百科,全文检索,高亮,搜索推荐。9 L6 |; W) f0 b9 q( C6 T
(2)The Guardian(国外新闻网站),类似搜狐新闻,用户行为日志(点击,浏览,收藏,评论)+社交网络数据(对某某新闻的相关看法),数据分析,给到每篇新闻文章的作者,让他知道他的文章的公众反馈(好,坏,热门,垃圾,鄙视,崇拜)0 \! m8 C7 K4 R3 n0 l
(3)Stack Overflow(国外的程序异常讨论论坛),IT问题,程序的报错,提交上去,有人会跟你讨论和回答,全文检索,搜索相关问题和答案,程序报错了,就会将报错信息粘贴到里面去,搜索有没有对应的答案3 z2 D  `5 T" W5 {% U
(4)GitHub(开源代码管理),搜索上千亿行代码。
5 K) M  |6 g$ v4 J) C: g7 K7 K; p/ G(5)电商网站,检索商品。
* I, |6 d* i' U! t8 @(6)日志数据分析,logstash采集日志,ES进行复杂的数据分析(ELK技术,elasticsearch+logstash+kibana)
# U, c% H! S- w(7)商品价格监控网站,用户设定某商品的价格阈值,当低于该阈值的时候,发送通知消息给用户,比如说订阅手机的监控,如果iphone的手机低于3000块钱,就通知我,我就去买( \8 O7 W7 I! G) N5 z% I
(8)BI系统,商业智能,Business Intelligence。比如说有个大型商场集团,BI,分析一下某某区域最近3年的用户消费金额的趋势以及用户群体的组成构成,产出相关的数张报表,**区,最近3年,每年消费金额呈现100%的增长,而且用户群体85%是高级白领,开一个新商场。ES执行数据分析和挖掘,Kibana进行数据可视化国内。
$ o7 `$ w& _% A) U" _, i(9)国内:站内搜索(电商,招聘,门户,等等),IT OA系统搜索(OA,CRM,ERP,等等),数据分析(ES热门的一个使用场景)
: ~( d9 g+ d/ @2 L## 六、ElasticSearch面试题 -- 答案附录4, ?; @2 p: _3 R% x
& Z8 K: r% z* u: \/ P
### 1、elasticsearch 了解多少,说说你们公司 es 的集群架构,索引数据大小,分片有多少,以及一些调优手段 。
: K- P; ?% E( `# S/ {# j; ~. ?2 y
比如:ES 集群架构 13 个节点,索引根据通道不同共 20+索引,根据日期,每日递增 20+,索引:10 分片,每日递增 1 亿+数据,每个通道每天索引大小控制:150GB 之内。# ?  d" |7 a: X0 P
仅索引层面调优手段:, v. q' }6 M* W% c- N& E8 p
#### 1.1 设计阶段调优4 \4 v, T/ u% P
    . ]" K) s9 O' }! S- F8 s
  • 1. 根据业务增量需求,采取基于日期模板创建索引,通过 roll over API 滚动索引;' A4 t% O: W3 p; I8 Y! N! `
  • 2. 使用别名进行索引管理;8 [4 q2 }3 i5 g" W
  • 3. 每天凌晨定时对索引做 force_merge 操作,以释放空间;; `* x9 }! r2 n% ]# d0 `4 _
  • 4. 采取冷热分离机制,热数据存储到 SSD,提高检索效率;冷数据定期进行 shrink操作,以缩减存储;# ]6 v/ \" \' U- C% }
  • 5. 采取 curator 进行索引的生命周期管理;
    & z: M; `, `$ a" ^9 ]1 m! j
  • 6. 仅针对需要分词的字段,合理的设置分词器;
    7 r& I0 R- {' h) D# e1 n
  • 7. Mapping 阶段充分结合各个字段的属性,是否需要检索、是否需要存储等。……..& H/ J+ N+ n& v7 D' C0 h
#### 1.2 写入调优
7 b( Q. t# J3 u$ k) ]9 n
- v. _- A$ D, v) |  ]- w/ s2 [1 l
    # D* e+ w9 j, c8 r; `$ Z
  • 1、写入前副本数设置为 0;
    & h3 v6 c( ^* z7 q
  • 2、写入前关闭 refresh_interval 设置为-1,禁用刷新机制;
    + Y% C2 @$ D5 }. r
  • 3、写入过程中:采取 bulk 批量写入;- d1 X& y, r! O+ u/ H
  • 4、写入后恢复副本数和刷新间隔;" w% [% G& z. q& _# p- I
  • 5、尽量使用自动生成的 id。
    " l: j/ E  G/ e% L6 n
#### 1.3、查询调优
6 d- W9 \3 W1 v5 U$ [+ j3 ]
/ A! h( H# u  X9 a( e) u. |
    " m" r) g& L5 \* K6 W
  • 1. 禁用 wildcard;) ~% X' t! N% u6 y
  • 2. 禁用批量 terms(成百上千的场景);$ }/ h( Q$ X0 d, P/ v8 v
  • 3. 充分利用倒排索引机制,能 keyword 类型尽量 keyword;
    : k$ U7 v( z5 F/ ~, ]0 M+ @
  • 4. 数据量大时候,可以先基于时间敲定索引再检索;7 T7 G$ a6 T& V) t3 Z: s" W9 t, F
  • 5. 设置合理的路由机制。
    ; V; x3 W6 t) F2 n! Y
#### 1.4. 其他调优' k0 W' |; g2 ]/ @; H
部署调优,业务调优等。
# h1 }2 ?/ B8 b7 T2. elasticsearch 的倒排索引是什么?, X  y$ X$ T% `* N
3. elasticsearch索引数据多了怎么办,如何调优,部署?- K; ^0 _4 d' \' O$ p! G0 Z8 @  E
4. elasticsearch 是如何实现 master 选举的' q  K  {& N: Z. U' t, f0 ?
5. 详细描述一下 Elasticsearch 索引文档的过程
. P. S+ y& f- l+ u+ |3 O9 m& V6. 详细描述一下 Elasticsearch 搜索的过程?# V8 F# |: y1 I$ K3 H4 @7 r2 m  X+ K
7. Elasticsearch 在部署时,对 Linux 的设置有哪些优化方法9 j( e4 ~& y2 e- }4 `7 |' n) n
8. lucence 内部结构是什么?* t; X- S! S. y, X  j1 ]7 a
9. Elasticsearch 是如何实现 Master 选举的?
$ T. A1 ?, M, r& V+ [10. Elasticsearch 中的节点(比如共 20 个),其中的 10 个
8 a. V, v+ J# d& V11. 客户端在和集群连接时,如何选择特定的节点执行请求的?2 c+ x# |) a  C" b! S
12. 详细描述一下 Elasticsearch 索引文档的过程。
( w' C+ _1 E7 c. t! t. a& z/ B! X13. 详细描述一下 Elasticsearch 更新和删除文档的过程。  t: W8 E! w2 ?& Q+ g5 W, U! k' l
14. 详细描述一下 Elasticsearch 搜索的过程。
. _+ l3 R, b! S: W/ C5 v# D' @' }15. 在 Elasticsearch中,是怎么根据一个词找到对应的倒排索引的?8 k  e1 D+ L0 C2 a4 @( `' q
16. Elasticsearch 在部署时,对 Linux 的设置有哪些优化方法?2 n5 S7 Z+ q0 m0 t
17. 对于 GC 方面,在使用 Elasticsearch 时要注意什么?* t" I' _$ b# e0 \. Q- @
18. Elasticsearch 对于大数据量(上亿量级)的聚合如何实现?
$ b! N! H, q8 J19. 在并发情况下,Elasticsearch 如果保证读写一致?3 X. P6 F7 h! i, q- [
20. 如何监控 Elasticsearch 集群状态?
' h1 G. Y3 s* d0 P21. 介绍下你们电商搜索的整体技术架构。
1 u- ?# ~7 m( p* h22. 介绍一下你们的个性化搜索方案?6 ^* Q7 W7 l9 |
23. 是否了解字典树?8 r" k# E3 G1 v  q
24. 拼写纠错是如何实现的?, ^4 ]) c0 S8 V% L
七、ElasticStack -- 参考附录3' r1 J  u. T+ _( [: e, w  R

. P! o( l% ~$ k+ |' L! H, E) c  x. t% N
  p+ T# B  O: b, ]8 e! A
6 s6 Y8 l! u) s5 d8 H) [

; |% T. W( ?3 e+ F' y6 Q' U- M- b8 `9 `
$ M/ U4 K$ ]8 d

9 N2 {( T* b" f# V1 c

6 {$ H; [+ {1 p
8 ?# X" ~. B( Y1 P' v& G, M  Q% z+ r/ e% D, ~

" T! a8 h2 h( R" R5 [

4 X9 m$ L% ^% }* V+ {
! `7 b) ]/ i3 n1 h* T+ y& |# R  L! B( C+ V% _( b$ p9 Y- R
0 I4 p  G. w: V3 w& O
/ f& k& H  U9 h& {+ S

2 G1 T# [7 W% g+ j% I3 n/ R9 ~1 a/ _0 @6 k. Y/ X

# G. W! ^/ O/ L/ @8 a5 E% @+ Z& }
2 T  C+ |  C  X  G3 l) D9 m1 i. g$ B

% M  g3 Z! {4 ]9 N# f5 n! |" X
/ L; S* B7 o# l; r% X) x5 S8 v+ |1 f- k  R! N& l

/ V* j1 ?( Y' u: n* B/ t2 W6 z+ L& h5 s: M) f& k7 o# R3 F0 q
6 h) v8 T' d! _1 c

2 o2 Q7 M# b3 @) S) L: Z
* d, w  ^2 g# [% P

4 Z) d/ i3 v: H2 C, `  O( V, y. \3 d/ h

3 z# k* Q) H5 ]( O6 A9 g; \; L8 W

% n5 c5 v  ^' e4 \8 W1 `( V7 w
4 w0 L/ X- s: ?1 D: c4 q+ {' W% c7 x$ \  {8 ?
: P; W, [% u5 P: n
. D1 c5 V: C! w2 k

, X0 m4 @1 a% T: P+ f( r3 D  R" ~: X7 [. h5 |7 d" `6 _
# t5 @. V! s  `
) Y- P% z- i7 ~' c$ S
/ W, G5 ^" F1 ~4 j

$ P' B8 e7 ^$ ~$ h
* j: r7 D% l" ^/ ^$ |" Y  ]

* b. ~1 o" x1 g$ r1 g## 参考资料
2 l) Q1 k+ \+ d; O7 `" D  U& |: S" ]: B3 m1 Q+ I& L- Y
- 附录1:[Elasticsearch简介与实战](https://www.jianshu.com/p/d48c32423789). \/ l# P3 t3 P, O$ }. C
- 附录2:[ElasticSearch入门](https://www.imooc.com/learn/889)0 M0 m) h9 }1 \* @9 e
- 附录3:[Elastic Stack入门](https://www.imooc.com/learn/920)& J* [$ Q) C1 v3 M
- 附录4:[新年手打,24道进阶必备Elasticsearch 面试真题(建议收藏!)](https://zhuanlan.zhihu.com/p/102500311)9 Y9 i8 i  r- q; f
- 附录5:[38页PPT干货:Elasticsearch架构解析与最佳实践](https://www.toutiao.com/a6831081253404410382/)
3 e1 m9 E1 ]# f- 附录6:[Elasticsearch分布式搜索引擎架构(万字总结)](https://www.toutiao.com/a6912314579586466317/)2 Z0 x& l! X3 ^3 D5 e) s  @
- 附录7:[天哪,终于有人把Elasticsearch架构原理讲明白了,值得一看](https://www.toutiao.com/a6827104963278144007/)
您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

12

金钱

0

收听

0

听众
性别

新手上路

金钱
12 元