Elasticsearch技术


一、谈一下Elasticsearch的理解?

1、Elasticsearch的基本概念

  • 基本概念表(对标MySQL)

    概念描述
    index索引等同于MySQL的数据库,存储数据
    type类型等同于MySQL的表结构
    document文档等同于MySQL中的一行数据
    Filed字段Field是Elasticsearch的最小单位,一个document里面有多个field
    shard 分片单台机器无法存储大量数据,es可以将一个索引中的数据切分为多个shard,分布在多台服务器上存储。有了shard就可以横向扩展,存储更多数据,让搜索和分析等操作分布到多台服务器上去执行,提升吞吐量和性能;
    replica 副本任何一个服务器随时可能故障或宕机,此时 shard 可能会丢失,因此可以为每个 shard 创建多个 replica 副本

2、什么是倒排索引?

  • Elasticsearch是一个分布式全文检索引擎,底层基于Lucene的倒排索引技术,在底层采用了分段的存储模式,使它在读写时几乎完全避免了锁的出现,大大提升了读写性能,能够实现比关系型数据库更快的过滤与检索,可以近乎实时的进行存储与检索数据;

    索引结构原理优缺点
    正排索引 传统的正排索引(forward index):是以文档ID(key)作为关键字,正排表中记录文档中每个词项(term)的出现次数与位置信息(value)

     当搜索时,扫描表中的每个文档中的词项(term)信息,直到找出所有包含了查询关键字的文档,然后返回搜索结果;
    优点: 索引结构简单易维护,删除或建立某个文档索引非常方便;

    缺点: 检索某个关键词时,需要遍历全部的文档,以确保没有遗漏,使得检索时间大大延长,检索效率低;
    倒排索引 倒排索引(invert index):以词项(term)作为关键字(key)进行索引,倒排表中记录出现了该关键字的文档ID(包括关键字的位置情况);总结来说:就是把文档ID对应到关键词的映射,转换为了关键词到文件ID的映射;

     当搜索某个关键词key时,
     ① ES首先会将搜索关键词进行分词(规范化和去重),切分成多个词项(term);
     ② 然后对于每个词项(term),查询得到对应的倒排表(Posting List);再对每个词项的倒排表进行合并或者取交集等操作,获得查询结果;
     ③ 最后对查询结果进行相关性打分 ,进行排序后返回搜索结果;
    优点: 查询的时候能够一次性查询到关键字对应的全部文档,查询效率比正向索引高的多;虽然倒排表不易建立与维护,但是这个过程是在后台进行的,因此不会影响整个搜索引擎的查询效率;

    缺点: 倒排表不易建立与维护;
  • 正排索引结构

    “文档1”的ID > 单词1:出现次数,出现位置列表;单词2:出现次数,出现位置列表;…………。
    “文档2”的ID > 此文档出现的关键词列表。
    在这里插入图片描述


  • 倒排索引结构

    “关键词1”:“文档1”的ID,“文档2”的ID,…………。
    “关键词2”:带有此关键词的文档ID列表。
    在这里插入图片描述


3、什么是全文检索

  • 全文检索与数据查询的区别

    检索类型定位查询方式相关度排序数据结构
    数据查询数据查询侧重高效、安全的存储普通的数据查询是SQL语句实现模糊查询(like),按照磁盘页的进行遍历查询,随机IO次数多,效率差;有明确的查询边界条件,结果没有相关度排序B+树
    全文检索全文检索侧重准确、方便的搜索全文检索是直接定位关键词所在磁盘页的位置,然后直接读取;全文检索对查询到的结果进行了相关性排序,没有明显的边界条件FST(有限状态转移机),变种字典树,共享前缀也能共享后缀

4、为什么Elasticsearch/Lucene检索比MySQL快?

  • 或者问为什么不用MySQL作为全文检索引擎?

    MySQLLucene
    磁盘IO层面Mysql只有term dictionary这一层,以B+树的数据结构存储在磁盘中,由于数据存储在B+树的叶子节点中,因此检索一个term词项需要若干次的随机磁盘IO,代价昂贵Lucene底层基于倒排索引技术,在term dictionary的基础上添加了term index来加速检索,term index以树的形式(FST)缓存在内存中。首先在内存term index中查到对应的term dictionary的磁盘块block位置之后,再去磁盘上找term,大大减少了磁盘随机IO的次数;
    数据结构层面B+树(存储在磁盘)FST(存储在内存),一种变种字典树,不但能共享前缀还能共享后缀;不但能判断查找的key是否存在,还能给出响应的输出(posting list);他在时间复杂度与空间复杂度上都做到了最大程度的优化,使得Luence能够将term dictionary的信息完全加载到内存,以根据读内存快速的定位到term所在的磁盘block位置;
    磁盘存储层面磁盘页(16KB)以磁盘块分block的形式进行存储,每个block内部利用公共前缀压缩,可以比b+tree更加节约磁盘空间
    读写层面多次随机磁盘IO先读内存定位后,再去磁盘找,IO次数少
    应用层面① 使用MySQL进行全文检索时,很容易因为左前缀原则等造成索引失效;

    ②使用MySQL进行全文检索的查询结果相关性差,并且无法与其它属性相关联;
    倒排索引技术,更快的查询,且能够通过倒排表posting list进行排序打分,能够给出相关性;

5、Elasticsearch/Lucene倒排索引技术?

  • 倒排索引总结性回答

    倒排索引结构位置优势数据结构
    Term Index
    (词项索引)
    内存作用: 提高检索速度,term index以变种字典树(FST)的数据结构在内存中存储Term dictionary的信息;检索数据时,先从内存中读取Term在磁盘块中的位置,然后磁盘IO直接去读,大大减少磁盘IO次数FST(有限状态转移机),存储在内存中

    ① 一种变种字典树,不但能共享前缀还能共享后缀;不但能判断查找的key是否存在,还能给出响应的输出(posting list);

    ② 它在时间复杂度与空间复杂度上都做到了最大程度的优化,使得Luence能够将Term dictionary的信息完全加载到内存,以根据读内存快速的定位到Term所在的磁盘block位置;
    Term Dictionary
    (词典)
    磁盘块(公共前缀压缩的block)作用: 在磁盘中,以公共前缀压缩的block存储由字典序排序后的全部Term,可以用二分查找(logN)次磁盘查找得到目标Term,然后通过指针找到指向的Posting List;×
    Posting List
    (倒排表)
    磁盘(FOR) / 内存(RBM)作用: Posting List是一个int的数组,每个词项都对应着一个倒排表,其中存储着包含该词项的全部文档id集合

    有了倒排表后,使得我们一次性能查得到包含该Term的全部文档id集合,无需像正排索引一样,遍历全部的文档,大大提高了检索的效率;
    1) 在磁盘中,Posting List 经过FOR压缩算法后,基于block(具体是比特位)存放的;

    2) 若Posting List被缓存到了内存中,是以Roaring Bitmap的数据结构进行存储的;

     ① 当block中的元素(short)小于4096个时(即8kb = 65536个比特位)时,使用的数据结构是short[];

     ②当block中的元素个数小于4096个时,使用的数据结构是BitSet;

    倒排索引结构:
    在这里插入图片描述


6、具体介绍一下Posting List压缩算法?

  • 1)为什么要压缩Posting List呢?

    原因解释如何实现
    节省磁盘空间与CPU① 节省磁盘空间: 全文检索动辄亿万级别的数据,倒排表需要非常大的磁盘空间存储,利用FOR压缩算法可以大幅度的优化磁盘空间;

    ② 节省CPU: 由于block是根据公共前缀压缩的,因此有压缩成本,之前没有FOR算法压缩磁盘空间是,使用的block磁盘块多,压缩成本也就高;现在有了FOR磁盘压缩算法,使用的block就少了,压缩成本也就降低了,而且此时若结合跳表skip list的方法进行Posting List的合并与交集操作,不仅跳过了遍历的成本,也跳过了压缩这些block的成本,从而节省了CPU
    FOR压缩算法
    内存缓存考虑将经常被访问的热点Term对应的倒排表(Posting List)利用合适的数据结构(RoaringBitMap)缓存到内存中,直接读内存不读磁盘,加快全文检索效率RoaringBitMap数据结构

  • 2)Posting List压缩算法

    层面压缩方式步骤
    磁盘FOR
    (压缩算法)
    ① 差值计算: 将Posting List按照升序排序后,相邻两个文档ID进行差值(delta)计算;

    ② 划分block: 将delta数字中的差值结果拆分为多个block,每个block有256个Doc Id;

    ③ bit编码存储: 计算每个block中最大的delta数字需要多少bit位进行存储;并且将最大bit位数放入block头部,使用该bit数来编码所有block内所有delta数字;
    内存RoaringBitMap
    (数据结构)
    核心压缩思想: 与其保存100个0,占用100个bit。还不如保存0一次,然后声明这个0重复了100遍;

    ① 将Postting List按照升序排序;

    ② 解压每个数字表示为(N / 65536,N % 65536);

    ③ 按照 N / 65536(高位) 进行划分block磁盘块,相同结果的划分到一个磁盘块中;

    ④ 将每个block进行编码:
      1) 若block中元素个数小于4096个(稀疏),则用short[]进行保存(随着数据的增加占用的空间也增加);
      2) 若block中元素大于4096个(稠密),则用bitSet(固定占8kb的空间,不随数据的增加而增加)进行保存;

  • 2.1)FOR压缩算法(磁盘压缩)

    本压缩算法是完全基于磁盘的,不需要任何内存。

    为了高效对posting list 计算交集和并集,需要posting list有序。排序后,我们就能利用有序性进行delta-encoding即差值压缩。其压缩方式叫做 Frame Of Reference(FOR)编码。示例如下:
    在这里插入图片描述
      1、差值计算: 将数字计算差值存放

      2、划分 block: 将1中结果拆分为多个block,每个Block有256个Doc Id(示意图只画了3个方便展示),以便按各个Block最大值分别按不同bit数表示从而有效压缩

      3、bit位编码: 根据最大值,比如第一个block最大值是227,则需要8个bit存放(2^8 = 256足够存放最大值227),所以每个值都用8bit存放就肯定够了;第二个block最大值30,需要5个bit存放(2^5 = 32足够存放最大值30),所以每个值都用5bit存放就肯定够了。将最大bit位数放入Block头部,然后使用该bit数来编码所有Block内所有delta数字。这就是所谓Frame Of Reference (FOR)。

  • 考虑到频繁出现的term(所谓low cardinality的值),比如gender里的男或者女。如果有1百万个文档,那么性别为男的posting list里就会有50万个int值。用Frame of Reference编码进行压缩可以极大减少磁盘占用。这个优化对于减少索引尺寸有非常重要的意义。当然mysql b-tree里也有一个类似的posting list的东西,但是未经过这样压缩的。

  • 举例说明FOR压缩: 对于73、300、302这3个数,原来73需要占用7个bit位(即128),300和302需要占用9个bit位(即512),分别存储他们一共需要25个bit位(4个Byte);经过FOR压缩后,先计算差值,得到0、227、2,他们被分到同一个block中,227是最大差值,那么227占用8个bit位(即256),那么就将8标记在该block磁盘头部,73和2都用8个bit位存储,只需要24bit位(3个Byte),数越大,压缩节省的空间越明显;

  • 因为这个Frame of Reference的编码是有解压缩成本的。所以如果利用skip list除了跳过了遍历的成本,也跳过了解压缩这些压缩过的block的过程,从而节省了cpu。


  • 为什么需要内存压缩?如何选择数据结构?

    在全文检索中,存在很多关键词term对应的posting List是超级热点的,比如:“个”、“的”这种,因此Luence全文检索引擎考虑将这个热点词汇在磁盘中对应的Posting List缓存到内存中,以加快检索效率;

    但是由于全文检索的数据是亿万级别的,可能对应的Posting List超级大,因此我们需要找到一个合适的数据结构来压缩这些数据,使得将Posting List缓存到内存这件事情变得可能。同时,考虑到联合查询,比如:查询TremA and TermB 或者 TremA or TermB,因此如何高效的对Posting List进行取交集与取并集操作,也成为了一个需要考虑的问题。

    综上分析,我们需要找到一个内存结构,具有以下两个特点:

     ① 能够大幅度压缩Posting List的内存占用;
     ② 能够高效的对Posting List进行取交集与取并集操作;

  • 根据以上分析,我们选择三种数据结构进行讨论:

    数据结构原理优缺点使用场景
    BitMapBitMap底层是int(32bit),一个int就能放32个数优点:
     ① 查询速度快,O(1)的查询复杂度;
     ② 节约空间,能够用少量空间存储大量的非重复数字;

    缺点:
     BitMap不适合存储稀疏数据,会超级浪费空间;比如,一个Posting List ={1,9999},为了表示这两个数,BitMap就需要用9999个bit位表示这两个数;
    与BitSet一致
    BitSetBitSet底层是long(64bit),它实现了一个按需增长的位向量,位 set 的每个组件都有一个boolean值;两个BitSet之间可进行位运算(逻辑与、逻辑或、逻辑异或)等操作;给BitSet1个GB的空间,能够大约存储85亿个数

    优缺点:
     与BitMap相比,能够快速的进行逻辑运算操作;其它的优缺点一样;
    ① 海量数据的统计工作,比如日志分析、用户数统计等;

    ② Bloom Filter(布隆过滤器);

    ③ 快速去重 + 快速查询O(1);
    RoaringBitMap
    (压缩位图索引)
    RoaringBitMap底层结构:

    ① short[] keys:key = N / 65536


    ② Container[] values:value = N % 65536

    ③ int size:包含了有效key和values中有效数据对的数量;
    解决了BitMap与BitSet存储稀疏数组时浪费空间的弊端;

    压缩思想:与其重复写100遍0,不如声明0重复了100遍;
    RBM是BitSet和BitMap的进阶版,集万千优点于一身;

  • 2.2)Roaring Bitmap(内存压缩)

    1)Roaring Bitmap的底层数据结构

    在这里插入图片描述

    数据结构计算作用
    short[] keyskey = N / 65536表示N这个值放在第key个Container中
    Container[] valuesvalue = N % 65536表示N这个值放在第key个文档中的第value个位置上

    有两种类型:① 若元素个数 < 4096:Array Container;② 若元素个数 > 4096:
    int sizesize = keys.length = values.length表示keys和values的长度

    2)Container的类型有两种:

    容器类型底层描述数据的插入与查找
    Array Container最多占用4096个short(8kb)用于存放稀疏数据,因为元素少于4096个时,存多少个数据,就占用多少个short;比如存10个数据,就只占10个short,即160个bit;而BitmapContainer的固定长度为1024个long(8kb),所以当数据少于4096个(8kb)时,默认用Array Container;二分查找(Array Container 是有序的)
    BitmapContainer固定占用1024个long(8kb)用于存放稠密数据,当元素个数大于4096时,Array Container自动转移为BitmapContainer,改为用位图索引存储;直接根据(N%65536)的计算结果定位插入与查询的索引

    3)⭐Array Container插入例子

    下面我们具体看一下Array Container中数据如何被存储的,例如,0x00020032(十进制131122)放入一个 RBM 的过程如下图所示:

      Step1: 计算 key = 131122 / 65536 = 2,应该插入到2号区域;

      Step2: 计算 value = 131122 % 65536 = 50,此时判断容器内部元素的个数是否大于4096个;

      Step3: 发现2号区域的Container元素只有4个,插入完才5个,那么直接插入到Array Container中;
    在这里插入图片描述

    4)⭐BitMapContainer插入例子

    下面我们具体看一下BitMapContainer中数据如何被存储的,例如,0xFFFF3ACB(十进制4294916811)放入一个 RBM 的过程如下图所示:

      Step1: 计算 key = 4294916811 / 65536 = 2,应该插入到65536号区域;

      Step2: 计算 value = 4294916811 % 65536 = 15051,此时判断容器内部元素的个数是否大于4096个;

      Step3: 发现2号区域的Container已经是位图了(大于4096),那么直接标记15051索引处为1,即表示插入成功;

    在这里插入图片描述


7、具体介绍一下Term Index?

  • 1)为什么需要Term Index?

      由于term dictiona存储在磁盘中,但是磁盘的随机IO操作仍然是非常昂贵,所以应该尽量少读磁盘,有必要把一些数据缓存到内存里。但是整个term dictionary本身又太大了,无法完整地放到内存里。而且就算term字典里我们可以按照term进行排序,用一个二分查找就可以定为这个term所在的地址,但这样的复杂度是logN,在term很多,内存放不下的时候,效率还是需要进一步提升。于是就有了term index,具体的底层数据结构是FST(有限状态转移机)

  • 2)FST(有限状态转移机)

    FST描述
    特点不但能共享前缀也能共享后缀,能够判断某个key存不存在,同时能够给出响应(Posting List)
    优点在范围查询、前缀搜索以及压缩率超级nb,使得我们能够最大程度的优化时间与空间复杂度,将term dictionary以term index的形式缓存到内存中
    缺点在单term的查询上可能相比hashMap没有明显优势

8、全文检索如何联合索引查询?—Posting List 如何取并集与交集?

  • 选择哪种方式,主要看是Posting List 有没有从磁盘缓存到内存中;

    Posting List 位置方式
    磁盘skip list(跳表)的方式进行并集或交集运算,由于磁盘中的FOR算法,使用skip list 不仅跳过了遍历的成本,还跳过了解压block的成本,节省了cpu;
    内存就用BitSet的逻辑运算实现多个Posting List的并集与交集运算

二、Elasticsearch索引文档(不是修改是建立)与搜索的过程

1、Elasticsearch索引文档流程

在这里插入图片描述

  • Elasticsearch写入文档,建立一个新索引的流程

    步骤描述
    Step1客户端发送写数据的请求,ES为数据分配一个文档ID;请求可以随机发往任意节点,该节点成为协调节点;
    Step2计算文档要写入哪个分片(sharding),默认为 shard_ID = hash(文档_ID) % 分片的总数;ES也支持轮询法指定分片;
    Step3协调节点进行路由,将写数据请求转发给shard_ID所在的ES节点;
    Step4(先写内存)在内存中建立一个索引 (Index),该Index在内存中会形成一个分段对象 (Segment);
    Step5(再写日志) 然后将索引数据写到日志 (Translog) 与 sharding-备份分片

    ① 在这个过程中,每隔1s,会将内存中的Segment刷新到系统文件缓存区,方便让用户快速的进行查询(因为用户查询直接访问内存或者磁盘,速度会变慢);

    ② 当过了30min或者Translog日志中的数据超过了512M,那么系统文件缓存区中的Segment就会将数据刷写 (flush) 到磁盘中,刷写后内存的Segment将会被清除;如果磁盘中的Segment多了后,磁盘就会将这些Segment进行合并;
    Step6协调节点确保上述步骤都完成后,返回客户端写入成功的响应;

  • Step5:【数据保存的过程】:先内存Segment,再日志,然后刷到系统缓存区,达到写磁盘条件则写入磁盘,清除内存缓存;达到磁盘Segment合并阈值,则合并;
    在这里插入图片描述

2、Elasticsearch搜索流程

  • ES搜索过程:Query then Fetch(查询后取回)

    步骤描述
    Step1客户端发送查询请求(关键词key),可以发给任意节点,该节点成为协调节点;
    Step2协调节点将查询请求的key广播到每一个ES节点,这些节点的分片sharding就会各自处理查询请求;
    Step3每个分片根据key进行数据查询,具体步骤如下:

    ① 首先,根据ES指定的分词器,将查询关键词key进行分词 (规范化、去重),分成多个词项term;

    ② 对于每一个词项term,分别根据内存中的term index (FST) 查询该包含了该term的文档在磁盘块block中的位置,同时输出倒排表Posting List;

    ③ 再对每个词项的倒排表进行合并或者取交集等操作,获得合并后的倒排表,进行打分排序(参考的是本分片中的信息)
    Step4① Query阶段 (轻量级),每个分片通过查询倒排索引,返回的是文档ID集合,并不是数据】待到全部分片的查询全部结束后,将符合条件的查询结果数据放入一个队列中,并将这些数据的文档ID、节点信息、分片信息全部返回给协调节点;
    Step5② Scroll分析 (经过轻量级的Query阶段后,免去了繁重的全局排序过程)】,由协调节点将所有的查询结果进行筛选 + 汇总 + 排序,丢弃一些数据;
    Step6③ Fetch阶段 (重量级),将筛选后的数据 (所有信息) 全部取回】,协调节点处理完毕后,向包含剩余文档ID的分片发送 get() 请求,对应的分片将数据返回给协调节点;待取回全部分片的数据后,协调节点将查询结果数据整合起来,返回给客户端;

    注意: Query Then Fetch 的搜索类型在文档相关性打分的时候参考的是本分片的数据,这样在文档数量较少的时候可能不够准确,DFS Query Then Fetch 增加了一个预查询的处理,询问 Term 和 Document的出现频率,这个评分更准确,但是性能会变差。


3、Elasticsearch更新与删除流程

  • 删除和更新都是写操作,但是由于 Elasticsearch 中的文档(底层是段Segment)是不可变的,因此不能被删除或者改动以展示其变更;所以 ES 利用 .del 文件 标记文档是否被删除,磁盘上的每个段都有一个相应的.del 文件

    操作描述
    更新将旧的文档标记为deleted状态,然后创建一个新的文档;
    删除文档其实并没有真的被删除,而是在 .del 文件中被标记为 deleted 状态。该文档依然能匹配查询,但是会在结果中被过滤掉;
  • 在内存缓存区中,每隔1s就产生一个Segment文件,当Segment文件达到一定阈值时,就会定期的执行merge操作,每次 merge 的时候,会将多个 segment 文件合并成一个,同时这里会将标识为 deleted 的 doc 给物理删除掉不写入到新的 segment 中,然后将新的 segment 文件写入磁盘,这里会写一个 commit point 标识所有新的 segment 文件,然后打开 segment 文件供搜索使用,同时删除内存中旧的 segment 文件

三、并发情况下,Elasticsearch 如果保证读写一致?

  • 三种解决方案

    方案描述
    版本号机制读写冲突不是很大时,可以通过版本号机制,在应用层解决,只有当携带的版本号 > 当前实际版本号时,才能修改;
    针对写操作ES支持三种一致性级别:

    ① quorum: 只有当一半以上的分片可用时,才允许写操作(保证写操作能够同时写入、备份成功),这样用户查询备份分片节点时也能查询到一致的数据;

    ② one: 只要主分片数据保存成功,那么客户端就可以进行查询操作;

    ③ all: 最高的一致性级别,要求所有的分片数据全部写入成功后,用户才能进行查询操作;以确保用户一定能查询到刚写入的数据;
    针对读操作① 设置ES同步,阻塞直到主分片与备份分片都执行完写操作后才返回查询的数据;

    ② 设置搜索请求,强制客户端取主分片查询,确保是最新结果;

四、Elasticsearch 应用上的问题汇总

1、DocValues的作用:

  • 倒排索引也是有缺陷的,假如我们需要对数据做一些聚合操作,比如排序/分组时,lucene内部会遍历提取所有出现在文档集合的排序字段,然后再次构建一个最终的排好序的文档集合list,这个步骤的过程全部维持在内存中操作,而且如果排序数据量巨大的话,非常容易就造成solr内存溢出和性能缓慢。

  • DocValues 就是 ES 在构建倒排索引的同时,构建了正排索引,保存了docId到各个字段值的映射,可以看作是以文档为维度,从而实现根据指定字段进行排序和聚合的功能;

  • 另外doc Values 保存在操作系统的磁盘中,当docValues大于节点的可用内存,ES可以从操作系统页缓存中加载或弹出,从而避免发生内存溢出的异常,docValues远小于节点的可用内存,操作系统自然将所有Doc Values存于内存中(堆外内存),有助于快速访问。


2、text 和 keyword类型的区别?

  • 类型区别
    text类型分词,建立倒排索引;
    keyword类型不分词,只能通过精确值搜索到;

3、query 和 filter 的区别?

  • 类型区别
    query计算分值与相关度
    filter只判断是否满足查询条件,不会计算分值与相关度,且经过filter查询的结果可以被缓存到内存中,提高检索性能
  • 2
    点赞
  • 4
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
前言 第1章 Elasticsearch入门 1 1.1 Elasticsearch是什么 1 1.1.1 Elasticsearch的历史 2 1.1.2 相关产品 3 1.2 全文搜索 3 1.2.1 Lucene介绍 4 1.2.2 Lucene倒排索引 4 1.3 基础知识 6 1.3.1 Elasticsearch术语及概念 6 1.3.2 JSON介绍 10 1.4 安装配置 12 1.4.1 安装Java 12 1.4.2 安装Elasticsearch 12 1.4.3 配置 13 1.4.4 运行 15 1.4.5 停止 17 1.4.6 作为服务 17 1.4.7 版本升级 19 1.5 对外接口 21 1.5.1 API约定 22 1.5 .2 REST介绍 25 1.5.3 Head插件安装 26 1.5.4 创建库 27 1.5.5 插入数据 28 1.5.6 修改文档 28 1.5.7 查询文档 29 1.5.8 删除文档 29 1.5.9 删除库 30 1.6 Java接口 30 1.6.1 Java接口说明 30 1.6.2 创建索引文档 33 1.6.3 增加文档 34 1.6.4 修改文档 35 1.6.5 查询文档 35 1.6.6 删除文档 35 1.7 小结 36 第2章 索引 37 2.1 索引管理 37 2.1.1 创建索引 37 2.1.2 删除索引 39 2.1.3 获取索引 39 2.1.4 打开/关闭索引 40 2.2 索引映射管理 41 2.2.1 增加映射 41 2.2.2 获取映射 44 2.2.3 获取字段映射 45 2.2.4 判断类型是否存在 46 2.3 索引别名 46 2.4 索引配置 51 2.4.1 更新索引配置 51 2.4.2 获取配置 52 2.4.3 索引分析 52 2.4.4 索引模板 54 2.4.5 复制配置 55 2.4.6 重建索引 56 2.5 索引监控 60 2.5.1 索引统计 60 2.5.2 索引分片 62 2.5.3 索引恢复 63 2.5.4 索引分片存储 64 2.6 状态管理 64 2.6.1 清除缓存 64 2.6.2 索引刷新 64 2.6.3 冲洗 65 2.6.4 合并索引 65 2.7 文档管理 66 2.7.1 增加文档 66 2.7.2 更新删除文档 69 2.7.3 查询文档 73 2.7.4 多文档操作 76 2.7.5 索引词频率 80 2.7.6 查询更新接口 83 2.8 小结 87 第3章 映射 88 3.1 概念 88 3.2 字段数据类型 90 3.2.1 核心数据类型 91 3.2.2 复杂数据类型 96 3.2.3 地理数据类型 100 3.2.4 专门数据类型 106 3.3 元字段 108 3.3.1 _all字段 109 3.3.2 _field_names字段 109 3.3.3 _id字段 110 3.3.4 _index字段 110 3.3.5 _meta字段 111 3.3.6 _parent字段 111 3.3.7 _routing字段 112 3.3.8 _source字段 114 3.3.9 _type字段 115 3.3.10 _uid字段 115 3.4 映射参数 116 3.4.1 analyzer参数 116 3.4.2 boost参数 118 3.4.3 coerce参数 119 3.4.4 copy_to参数 120 3.4.5 doc_values参数 121 3.4.6 dynamic参数 122 3.4.7 enabled参数 122 3.4.8 fielddata参数 123 3.4.9 format参数 126 3.4.10 geohash参数 128 3.4.11 geohash_precision参数 129 3.4.12 geohash_prefix参数 130 3.4.13 ignore_above参数 131 3.4.14 ignore_malformed参数 131 3.4.15 include_in_all参数 132 3.4.16 index参数 133 3.4.17 index_options参数 133 3.4.18 lat_lon参数 134 3.4.19 fields参数 135 3.4.20 norms参数 136 3.4.21 null_value参数 137 3.4.22 position_increment_gap参数 137 3.4.23 precision_step参数 138 3.4.24 properties参数 138 3.4.25 search_analyzer参数 139 3.4.26 similarity参数 140 3.4.27 store参数 141 3.4.28 term_vector参数 141 3.5 动态映射 142 3.5.1 概念 142 3.5.2 _default_映射 143 3.5.3 动态字段映射 143 3.5.4 动态模板 145 3.5.5 重写默认模板 148 3.6 小结 148 第4章 搜索 149 4.1 深入搜索 149 4.1.1 搜索方式 149 4.1.2 重新评分 153 4.1.3 滚动查询请求 155 4.1.4 隐藏内容查询 158 4.1.5 搜索相关函数 161 4.1.6 搜索模板 164 4.2 查询DSL 167 4.2.1 查询和过滤的区别 167 4.2.2 全文搜索 168 4.2.3 字段查询 179 4.2.4 复合查询 183 4.2.5 连接查询 188 4.2.6 地理查询 190 4.2.7 跨度查询 197 4.2.8 高亮显示 200 4.3 简化查询 203 4.4 小结 206 第5章 聚合 207 5.1 聚合的分类 207 5.2 度量聚合 209 5.2.1 平均值聚合 209 5.2.2 基数聚合 211 5.2.3 最大值聚合 213 5.2.4 最小值聚合 214 5.2.5 和聚合 214 5.2.6 值计数聚合 215 5.2.7 统计聚合 215 5.2.8 百分比聚合 215 5.2.9 百分比分级聚合 216 5.2.10 最高命中排行聚合 217 5.2.11 脚本度量聚合 217 5.2.12 地理边界聚合 221 5.2.13 地理重心聚合 222 5.3 分组聚合 223 5.3.1 子聚合 224 5.3.2 直方图聚合 226 5.3.3 日期直方图聚合 230 5.3.4 时间范围聚合 233 5.3.5 范围聚合 234 5.3.6 过滤聚合 235 5.3.7 多重过滤聚合 236 5.3.8 空值聚合 238 5.3.9 嵌套聚合 239 5.3.10 采样聚合 240 5.3.11 重要索引词聚合 242 5.3.12 索引词聚合 245 5.3.13 总体聚合 251 5.3.14 地理点距离聚合 251 5.3.15 地理散列网格聚合 253 5.3.16 IPv4范围聚合 255 5.4 管道聚合 257 5.4.1 平均分组聚合 259 5.4.2 移动平均聚合 261 5.4.3 总和分组聚合 262 5.4.4 总和累计聚合 262 5.4.5 最大分组聚合 264 5.4.6 最小分组聚合 265 5.4.7 统计分组聚合 266 5.4.8 百分位分组聚合 268 5.4.9 差值聚合 269 5.4.10 分组脚本聚合 273 5.4.11 串行差分聚合 275 5.4.12 分组选择器聚合 276 5.5 小结 277 第6章 集群管理 278 6.1 集群节点监控 278 6.1.1 集群健康值 278 6.1.2 集群状态 279 6.1.3 集群统计 280 6.1.4 集群任务管理 280 6.1.5 待定集群任务 281 6.1.6 节点信息 281 6.1.7 节点统计 282 6.2 集群分片迁移 283 6.3 集群节点配置 284 6.3.1 主节点 285 6.3.2 数据节点 286 6.3.3 客户端节点 286 6.3.4 部落节点 287 6.4 节点发现 287 6.4.1 主节点选举 288 6.4.2 故障检测 288 6.5 集群平衡配置 289 6.5.1 分片分配设置 289 6.5.2 基于磁盘的配置 290 6.5.3 分片智能分配 291 6.5.4 分片配置过滤 292 6.5.5 其他集群配置 293 6.6 小结 293 第7章 索引分词器 294 7.1 分词器的概念 294 7.2 中文分词器 298 7.3 插件 300 7.3.1 插件管理 301 7.3.2 插件安装 301 7.3.3 插件清单 302 7.4 小结 304 第8章 高级配置 305 8.1 网络相关配置 305 8.1.1 本地网关配置 305 8.1.2 HTTP配置 306 8.1.3 网络配置 307 8.1.4 传输配置 308 8.2 脚本配置 310 8.2.1 脚本使用 311 8.2.2 脚本配置 313 8.3 快照和恢复配置 318 8.4 线程池配置 324 8.5 索引配置 326 8.5.1 缓存配置 326 8.5.2 索引碎片分配 329 8.5.3 合并 332 8.5.4 相似模块 332 8.5.5 响应慢日志监控 333 8.5.6 存储 335 8.5.7 事务日志 336 8.6 小结 337 第9章 告警、监控和权限管理 338 9.1 告警 338 9.1.1 安装 338 9.1.2 结构 339 9.1.3 示例 352 9.1.4 告警输出配置 354 9.1.5 告警管理 355 9.2 监控 356 9.2.1 安装 356 9.2.2 配置 357 9.3 权限管理 360 9.3.1 工作原理 361 9.3.2 用户认证 361 9.3.3 角色管理 366 9.3.4 综合示例 368 9.4 小结 369 第10章 ELK应用 370 10.1 Logstash 370 10.1.1 配置 371 10.1.2 插件管理 374 10.2 Kibana配置 377 10.2.1 Discover 379 10.2.2 Visualize 381 10.2.3 Dashboard 383 10.2.4 Settings 386 10.3 综合示例 387 10.4 小结 390 附录 Elasticsearch 5.0的特性与改进 391
根据提供的引用内容,以下是关于Elasticsearch技术调研的介绍: Elasticsearch是一个开源的分布式搜索和分析引擎,它构建在Apache Lucene库之上。它提供了一个分布式多租户的全文搜索引擎,可以实时地存储、检索和分析大规模数据。Elasticsearch具有高可用性、可扩展性和强大的搜索功能,适用于各种应用场景,包括日志分析、实时数据分析、全文搜索等。 在进行Elasticsearch技术调研时,可以关注以下几个方面: 1. 数据存储和索引:Elasticsearch使用倒排索引来加速搜索和过滤操作。它将数据存储在分片中,并使用主分片和副本分片来提供高可用性和容错性。 2. 分布式架构:Elasticsearch采用分布式架构,可以水平扩展以处理大规模数据。它使用分片和副本来实现数据的分布和冗余存储,提供高可用性和负载均衡。 3. 查询和搜索:Elasticsearch提供了丰富的查询语法和搜索功能,包括全文搜索、过滤、聚合等。它支持复杂的查询操作,并提供了相关性评分和高亮显示等功能。 4. 实时数据分析:Elasticsearch支持实时数据分析,可以对大规模数据进行聚合、统计和可视化。它提供了强大的聚合功能,可以对数据进行分组、求和、平均等操作。 5. 可视化和监控:Elasticsearch提供了Kibana工具,用于可视化和监控数据。Kibana可以连接到Elasticsearch集群,提供实时的数据可视化和仪表盘。 6. 安全性和权限控制:Elasticsearch提供了安全性和权限控制功能,可以对数据进行访问控制和身份验证。它支持基于角色的访问控制和SSL/TLS加密。 7. 故障恢复和容错性:Elasticsearch具有故障恢复和容错性,可以自动处理节点故障和数据丢失。它使用分片和副本来实现数据的冗余存储和自动恢复。 8. 扩展性和集成:Elasticsearch具有良好的扩展性和集成性,可以与其他工具和系统进行集成。它提供了丰富的API和插件机制,可以扩展其功能和集成其他系统。 以上是关于Elasticsearch技术调研的介绍,希望对您有帮助。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值