Elasticsearch是一个分布式可拓展的实时搜索和分析引擎

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

  实时分析的分布式搜索引擎

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

文件存储:Elasticsearch,面向文档型数据库,一条数据就是一个文档,用JSON作为文档序列化的格式

MySQL和Elasticsearch数据关系术语对比:

  关系数据库-数据库-表-行-列

  Elasticsearch-索引-类型-文档-字段

Elasticsearch的交互:可以使用Java API,也可以直接使用HTTP的Restful API方式

Elasticsearch强大的索引能力:精髓-一切设计都是为了提高搜索的性能

什么是倒排索引?举个例子

| ID | Name | Age | Sex |

| - - |:-------:| -----:| -----:|

| 1 | Kate | 24 | Female

| 2 | John | 24 | Male

| 3 | Bill | 29 | Male

ID是Elasticsearch自建的文档ID,Name、Age、Sex索引如下:

Name:| Term | Posting List |

   | -- |:----:|

   | Kate | 1 |

   | John | 2 |

   | Bill | 3 |

Age:| Term | Posting List |

  | -- |:----:|

  | 24 | [1,2] |

  | 29 | 3 |

Sex:| Term | Posting List |

  | -- |:----:|

  | Female | 1 |

  | Male | [2,3] |

Posting List

  Elasticsearch分别为每个field都建立了一个倒排索引,

  Kate ,24,Female,John,Male,Bill,29这些是Term。

  而1,2,3是文档ID,[1][3][1,2][2,3]这些就是Posting List。

  Posting List就是一个int的数组,存储了所有符合这个Term的文档ID。

Term Dictionnary

  Elasticsearch将所有的Term排个序,二分法查找Term,logN的查找效率。

Term Index

  Term Index是Term Dictionnary的索引,包含的是Term的一些前缀。

Frame Of Reference

  Elasticsearch要求Posting List是有序的,方便压缩。

  原理:通过增量,将原来的大数变成小数,仅储存增量值,再按bit排好队,最后通过字节存储。

Roaring Bitmaps

  Bitmap是一种数据结构,假设Posting List[1,3,4,7,10],对应的Bitmap就是[1,0,1,1,0,0,1,0,0,1],非常直观,用0/1表示某个值是否存在。

  Bitmap的缺点是存储空间随着文档个数线性增长。Roaring bitmaps需要用到某些指数特性:将posting list按照65535为界限分块,用<商,余数>的组合表示每一组id。

联合索引

  如果多个field索引的联合查询,倒排索引如何满足快速查询的要求呢?

  利用跳表的数据结构快速做”与“运算,或者利用bitset按位”与“。

Elasticsearch的索引思路:

  将磁盘里的东西尽量搬进内存,减少磁盘随机读取次数(同时也利用磁盘顺序读特性),结合各种压缩算法,用极其苛刻的态度使用内存。

所以,对于使用Elasticsearch进行索引时需要注意:

  不需要索引的字段,一定要明确定义出来,因为默认是自动建索引的

  同样的道理,对于String类型的字段,不需要analysis的也需要明确定义出来,因为默认也是会analysis的

  选择有规律的ID很重要,随机性太大的ID(比如java的UUID)不利于查询

关于最后一点,个人认为有多个因素:

  上面看到的压缩算法,都是对Posting list里的大量ID进行压缩的,那如果ID是顺序的,或者是有公共前缀等具有一定规律性的ID,压缩比会比较高;

  最影响查询性能的,应该是最后通过Posting list里的ID到磁盘中查找Document信息的那步,因为Elasticsearch是分Segment存储的,Term定位到Segment的效率直接影响了最后查询的性能,

  如果ID是有规律的,可以快速跳过不包含该ID的Segment,从而减少不必要的磁盘读次数

学习Elasticsearch原理笔记的更多相关文章

  1. 读Flask源代码学习Python--config原理

    读Flask源代码学习Python--config原理 个人学习笔记,水平有限.如果理解错误的地方,请大家指出来,谢谢!第一次写文章,发现好累--!. 起因   莫名其妙在第一份工作中使用了从来没有接 ...

  2. ElasticSearch原理

    Elasticsearch-基础介绍及索引原理分析 最近在参与一个基于Elasticsearch作为底层数据框架提供大数据量(亿级)的实时统计查询的方案设计工作,花了些时间学习Elasticsearc ...

  3. Elasticsearch7.X 入门学习第九课笔记-----聚合分析Aggregation

    原文:Elasticsearch7.X 入门学习第九课笔记-----聚合分析Aggregation 版权声明:本文为博主原创文章,遵循CC 4.0 BY-SA版权协议,转载请附上原文出处链接和本声明. ...

  4. Elasticsearch7.X 入门学习第二课笔记----基本api操作和CRUD

    原文:Elasticsearch7.X 入门学习第二课笔记----基本api操作和CRUD 版权声明:本文为博主原创文章,遵循CC 4.0 BY-SA版权协议,转载请附上原文出处链接和本声明. 本文链 ...

  5. Elasticsearch7.X 入门学习第一课笔记----基本概念

    原文:Elasticsearch7.X 入门学习第一课笔记----基本概念 版权声明:本文为博主原创文章,遵循CC 4.0 BY-SA版权协议,转载请附上原文出处链接和本声明. 本文链接:https: ...

  6. ElasticSearch详细笔记

    ElasticSearch详细笔记 什么是ElasticSearch Elasticsearch(简称ES)是一个基于Apache Lucene(TM)的开源搜索引擎,无论在开源还是专有领域,Luce ...

  7. Head插件——学习Elasticsearch的锋刃利器!

    在学习Elasticsearch的过程中,必不可少需要通过一些工具查看es的运行状态以及数据.如果都是通过rest请求,未免太过麻烦,而且也不够人性化. 此时,head可以完美的帮助你快速学习和使用e ...

  8. hadoop2.5.2学习及实践笔记(二)—— 编译源代码及导入源码至eclipse

    生产环境中hadoop一般会选择64位版本,官方下载的hadoop安装包中的native库是32位的,因此运行64位版本时,需要自己编译64位的native库,并替换掉自带native库. 源码包下的 ...

  9. Python学习的个人笔记(基础语法)

    Python学习的个人笔记 题外话: 我是一个大二的计算机系的学生,这份python学习个人笔记是趁寒假这一周在慕课网,w3cschool,还有借鉴了一些博客,资料整理出来的,用于自己方便的时候查阅, ...

随机推荐

  1. NetworkX系列教程(8)-Drawing Graph

    小书匠Graph图论 如果只是简单使用nx.draw,是无法定制出自己需要的graph,并且这样的graph内的点坐标的不定的,运行一次变一次,实际中一般是要求固定的位置,这就需要到布局的概念了.详细 ...

  2. c++ 字符串转数字

    #字符串转整数 string ss="-99"; cout<< stoi(ss)<<endl;

  3. codeforces#1249F. Maximum Weight Subset(树上dp)

    题目链接: http://codeforces.com/contest/1249/problem/F 题意: 一棵树的每个节点有个权值,选择一个节点集,使得任意点对的距离大于$k$ 求最大节点集权值, ...

  4. CentOS7 升级Python2.x到3.x

    CentOS 7 中默认安装了 Python,版本比较低(2.7.5),为了使用新版 3.x,需要对旧版本进行升级.由于很多基本的命令.软件包都依赖旧版本,比如:yum.所以,在更新 Python 时 ...

  5. (转)hadoop balancer(重新平衡)

    借鉴:https://blog.csdn.net/mnasd/article/details/80369603?utm_source=blogxgwz2 参考文档:  http://blog.csdn ...

  6. 在 Arch 上Yaourt 使用这些替代品

    1. aurman aurman 是最好的 AUR 助手之一,也能胜任 Yaourt 替代品的地位.它有非常类似于 pacman 的语法,可以支持所有的 pacman 操作.你可以搜索 AUR.解决包 ...

  7. java四种对象引用类型

    java四种对象引用类型 对象的强.软.弱和虚引用 在JDK 1.2以前的版本中,若一个对象不被任何变量引用,那么程序就无法再使用这个对象.也就是说,只有对象处于可触及(reachable)状态,程序 ...

  8. 我的BO之状态控制

    我的BO 1-我的BO之强类型 2-我的BO之数据保护 3-我的BO之状态控制 4-我的BO之导航属性 MIS常有状态 信息管理系统(MIS)常常有流程,一个流程由多个环节构成,不同的环节的流转通过状 ...

  9. Windows下的apache maven安装与配置

    去到官网http://maven.apache.org/download.cgi下载压缩包我选择的是二进制zip压缩文件. 解压并配置压缩文件的目录到MAVEN_HOME环境变量,添加解压文件下的bi ...

  10. p2p通信原理及实现

    1.简介 当今互联网到处存在着一些中间件(MIddleBoxes),如NAT和防火墙,导致两个(不在同一内网)中的客户端无法直接通信.这些问题即便是到了IPV6时代也会存在,因为即使不需要NAT,但还 ...