elasticsearch 随笔

228 阅读5分钟

不错的文章: wizardforcel.gitbooks.io/mastering-e…

是一款全文搜索引擎,本质上是一个分布式数据库。

每台服务器可以运行多个es实例,每个实例就是一个节点node,多个节点构成一个集群(cluster)

索引index相当于一个数据库,type相当于表(6.x只允许有一个type),文档document相当于一条记录,document使用json格式表示。

中文分词器IK, 可以动态扩展词库。

倒排索引

Document: 它是在索引和搜索过程中数据的主要表现形式,或者称“载体”,承载着我们索引和搜索的数据,它由一个或者多个域(Field)组成。 Field: 它是Document的组成部分,由两部分组成,名称(name)和值(value)。 Term: 它是搜索的基本单位,其表现形式为文本中的一个词。 Token: 它是单个Term在所属Field中文本的呈现形式,包含了Term内容、Term类型、Term在文本中的起始及偏移位置。

可以把倒排索引想象成这样的一种数据结构:数据以Term为导向,而不是以Document为导向。下面看看一个简单的倒排索引是什么样的,假定我们的Document只有title域(Field)被编入索引,Document如下: * ElasticSearch Servier (document 1) * Mastering ElasticSearch (document 2) * Apache Solr 4 Cookbook (document 3) 所以索引(以一种直观的形式)展现如下: | Term | count | Docs | | -- | -- | -- | | 4 | 1 | <3> | |Apache | 1 | <3> | | Cookbook | 1 | <3> | | ElasticSearch | 2 | <1> <2> | | Mastering | 1 | <1> | | Server | 1 | <1> | | Solr | 1 | <3> |

分片与副本

分片:

索引分片即把一个索引的数据,分成多片分散在不用的节点上。

过度分配:设置分片数大于当前节点数,极端的情况在只有一个节点的情况下设置分片数为5,称为过度分配。过度分配在一定程度上增加了索引数据(分发到不同分片)和检索(合并数据)的复杂度,但是考虑到后边数据增长的情况下就不需要重新创建索引迁移数据了(分片数只能在新增的时候指定无法动态修改)。

索引数据的过程

协调节点接收请求,doc_id根据路由算法指定具体的分片,将请求分发到该分片的主分区对应的节点上,主节点写入成功后,分发到副本分片上,所有的副本分片写入成功,向协调节点报告成功,协调节点响应给客户端。

检索过程

检索时接收请求的节点分发请求到当前索引的每个主分片或者副本分片上,各个节点返回指定数量的数据到请求节点,请求节点进行合并返回。(这里的指定数量时客户端指定的数量,假设客户端请求10条数据,当前索引有三个分片那么汇总数据为30,由请求节点按优先级返回10条给客户端)

副本:

提高吞吐量和安全性,缺点是增加存储空间的消耗。(可以通过api动态修改副本数)

当一个主分片丢失可以推举当前分片的任意一个分支作为主分片。

路由:

实现定向存储,定向搜索。

java high rest client

在应用中一般使用java high rest client

www.elastic.co/guide/en/el….

常用的主要有三部分:

1)Indices APIs:

操作index和mapping(类似数据库中表的定义)

2)Document APIs

操作文档document,增删改查

3)Search APIs

提供各种检索Api :精确匹配term,全文检索match,权重查询,分页等等。

Rest api

在页面结合es-header或者使用curl命令

www.elastic.co/guide/en/el…

字段类型

字符串:
string 5.x之后不再支持
text 会被分词 全文匹配
keyword 不会被分词 精确匹配

整数类型:
byte -128~127
short -32768~32767
integer -231~231-1
long -263~263-1

浮点类型:
doule 64位双精度IEEE 754浮点类型 float 32位单精度IEEE 754浮点类型 half_float 16位半精度IEEE 754浮点类型 scaled_float 缩放类型的的浮点数

日期类型date

布尔类型Boolean

数组类型array

对象类型Object

二进制类型binary

ip类型

master节点选举

对所有可以成为master的节点根据nodeId排序,每次选举每个节点都把自己所知道节点排一次序,然后选出第一个(第0位)节点,暂且认为它是master节点。
如果对某个节点的投票数达到一定的值(可以成为master节点数n/2+1)并且该节点自己也选举自己,那这个节点就是master。否则重新选举。
对于brain split问题,需要把候选master节点最小值设置为可以成为master节点数n/2+1(quorum )

集群规划

主要考虑内存的占用,lucence需要将每个段的倒排索引都加载到JVM内存中,因此每一个open状态的索引都会在JVM中占据一部分常驻内存,是GC不掉的,1TB的index大约占用2GB的jvm内存,JVM堆内存配置31G,old区21G,这21G分配一半用来存储段,大约10G,数据量即为10/21=5T,即每个节点的数据量最好不超过为5T。 加入50T数据,副本数为2,则总共会占用503=150T数据,150/5=30